21

为什么我问这个:(也是在应用程序中尝试它的原因)

当我们在 Lollipop 中使用 Google Maps时会发生这种情况即使位置被禁用,它也会在用户从地图应用程序输入后以高精度模式打开,而无需访问设置。

启用蓝牙可以实现类似的功能,在我的应用程序中启动操作;用户需要做出选择,但用户不会被重定向到设置,使用:

startActivity(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));

可以在BluetoothAdapter上找到,现在我们知道没有 LocationAdapter,所以我环顾了一下gms->LocationServices,基本上几乎所有位置 API 参考下的android.location.LocationManager但似乎还没有任何类似ACTION_REQUEST_ENABLE的东西可用。

希望还有其他方法可以解决这个问题,让更多的人尝试过。

请注意:
context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));不是那样工作的。

4

3 回答 3

23

更新 3

提示用户将位置设置更改 为@patrickandroid,在评论中提到,第二次更新的链接已损坏

谷歌样本;android 位置和选项 - 供代码参考。

更新 2

谷歌样本;- 用于代码参考。

此示例基于此 repo 中包含的 LocationUpdates 示例构建,并允许用户使用位置对话框更新设备的位置设置。

使用 SettingsApi 确保根据应用的位置需求正确配置设备的系统设置。


更新 1

Google Play 服务 7.0 版(2015 年 3 月)发布...

位置设置- 虽然 FusedLocationProviderApi 结合了多个传感器为您提供最佳位置,但您的应用接收到的位置的准确性仍然很大程度上取决于设备上启用的设置(GPS、wifi、飞行模式等)。使用新的 SettingsApi 类,您可以调出位置设置对话框,该对话框显示一键式控件,用户无需离开您的应用即可更改其设置。

使用公共接口 SettingsApi

  • 确定设备上是否启用了相关系统设置以执行所需的位置请求。
  • 或者,调用一个对话框,允许用户通过单击启用必要的位置设置。


将上一部分留作参考:
更新/回答
对于寻找此答案的每个人,Google Play 服务 7.0
它添加了用于检测地点和连接到附近设备的 API,改进了移动广告、健身数据、位置设置等

在 Google Play 服务 7.0 中,我们引入了一种标准机制来检查是否为给定的 LocationRequest 成功启用了必要的位置设置。如果有可能的改进,您可以显示一键式控件,让用户无需离开您的应用即可更改其设置。

正是这个

这个 API 提供了一个很好的机会来提供更好的用户体验,特别是如果位置信息对您的应用程序的用户体验至关重要,例如谷歌地图集成了“位置设置”对话框并看到处于良好位置状态的用户数量。

来源: Android 开发者博客:Google Play services 7.0 - Places Everyone!

SDK 即将推出!
我们将在接下来的几天内推出 Google Play 服务 7.0。部署完成后,预计此博客文章、已发布文档以及 SDK 的可用性会得到更新。

将在实施后更新程序化 loc

于 2015-03-12T05:53:50.960 回答
22

基于上面的@user2450263 注释,这里有一些片段,

/**
 * Prompt user to enable GPS and Location Services
 * @param mGoogleApiClient
 * @param activity
 */
public static void locationChecker(GoogleApiClient mGoogleApiClient, final Activity activity) {
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);
    builder.setAlwaysShow(true);
    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(
                                activity, 1000);
                    } catch (IntentSender.SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.
                    break;
            }
        }
    });
}

并像使用它一样,

mGoogleApiClient = new GoogleApiClient
            .Builder(this)
            .enableAutoManage(this, 34992, this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    locationChecker(mGoogleApiClient, MyActivity.this);

基本上你的用户会得到这样的提示,他们可以在不进入设置的情况下以高精度模式启用位置 打开 GPS

于 2015-10-29T08:03:22.867 回答
1

我有解决方案,在 Android 6.0.1 Marshmallow 上测试,按钮事件OnClick调用 void:

private void openGPSSettings() {
    //Get GPS now state (open or closed)
    boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled(getContentResolver(), LocationManager.GPS_PROVIDER);

    if (gpsEnabled) {
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCATION_MODE, 0);
    } else {
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCATION_MODE, 3);
    }
}

Android需要启用USB调试或root。执行以下命令adb shell(从设备上的 root shell 或通过 USB 连接的计算机,如果设备没有 root):

pm grant com.example.application.test android.permission.WRITE_SECURE_SETTINGS

在应用清单中添加这些权限:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
于 2016-02-11T02:18:09.113 回答