以编程方式启用位置模式高精度或省电,无需用户访问设置

时间:2015-02-27 07:11:10

标签: android google-play-services android-5.0-lollipop android-location android-settings

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

当我们在Lollipop中使用 Google地图时,

会发生即使位置已停用,也会在用户从地图应用输入后以高精度模式打开,而无需访问设置。

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

startActivity(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));

可以在BluetoothAdapter上找到,现在我们知道没有LocationAdapter,所以我环顾了gms->LocationServices,基本上几乎所有事情都在Location API referencesandroid.location.LocationManager下但是没有似乎有ACTION_REQUEST_ENABLE之类的东西可用。

希望有相同的其他方法,更多人尝试过。

请注意:
context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));不起作用。

3 个答案:

答案 0 :(得分:22)

更新3

<强> Prompt the user to change location settings 正如@patrickandroid,在评论中提到,第二次更新的链接已被破坏

<强> GoogleSamples; android Location and options - for code reference.

更新2

<强> GoogleSamples; - for code reference.

  

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

     

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


更新1

Google Play services, Version 7.0 (March 2015) released...

  

位置设置 - 虽然FusedLocationProviderApi结合了多个传感器,为您提供最佳位置,但准确性   您的应用收到的位置仍然很大程度上取决于设置   在设备上启用(GPS,wifi,飞行模式等)。运用   在新的SettingsApi类中,您可以打开一个“位置设置”对话框   它显示一键式控件,供用户更改其设置   没有离开你的应用程序。

使用 public interface SettingsApi

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


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

  

在Google Play服务7.0中,我们引入了一种标准机制   检查是否为给定项启用了必要的位置设置   LocationRequest成功。如果有可能的改进,你   可以显示单触控件,供用户更改其设置   没有离开你的应用程序。

     

exactly this

     

此API为更好的用户提供了一个很好的机会   经验,特别是如果位置信息对于   您的应用的用户体验,例如Google地图的情况   他们整合了“位置设置”对话框并看到了戏剧性   在良好的位置状态下增加用户数量。

来源: Android developers blog: Google Play services 7.0 - Places Everyone!

  

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

将在实施后更新程序化的l-o-c

答案 1 :(得分:20)

根据上面的@ 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);

基本上,您的用户会得到这样的提示,他们可以在高精度模式下启用位置而无需进入设置 Turn on GPS

答案 2 :(得分:0)

我有解决方案,在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调试或植根。在adb shell中执行以下命令(如果设备未植根,则从设备上的根shell或通过USB连接的计算机执行):

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" />