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

Posted

技术标签:

【中文标题】以编程方式启用定位模式高精度或省电,无需用户访问设置【英文标题】:Enabling Location mode High Accuracy or Battery saving, programmatically, without user needing to visit Settings 【发布时间】:2015-04-29 20:00:23 【问题描述】:

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

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

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

startActivity(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));

可以在BluetoothAdapter上找到,现在我们知道没有LocationAdapter,所以我环顾了gms->LocationServices,基本上Location API references、android.location.LocationManager下的几乎所有东西,但看起来不像ACTION_REQUEST_ENABLE是至今可用。

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

请注意:context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); 不能这样工作。

【问题讨论】:

【参考方案1】:

更新 3

Prompt the user to change location settings 正如 cmets 中提到的@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 成功。如果有可能的改进,您 可以为用户显示一键式控件以更改其设置 无需离开您的应用。

这个 API 提供了一个很好的机会,可以让用户变得更好 经验,特别是如果位置信息对 您的应用程序的用户体验,例如 Google Maps 的情况 他们集成了“位置设置”对话框,并看到了一个戏剧性的 增加处于良好位置状态的用户数量。

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

SDK 即将推出! 我们将推出 Google Play 服务 7.0 接下来的几天。期待这篇博文的更新,已发布 文档,以及 SDK 在推出后的可用性 完成。

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

【讨论】:

我需要新的SDK下载,你可以添加链接吗?? 基本上你的 SDK 管理器 -> Extras -> Google Play Services ,更新它,它将包含在你的库项目中 上面的第一个链接坏了。 @patrickandroid 谢谢,更新了链接,还没有通过代码【参考方案2】:

我有解决方案,在 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 或如果设备没有root,则从通过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" />

【讨论】:

并非所有手机都已root。这不是一个可行的解决方案。 这不适用于无系统 root 的 android 6 设备,是吗?该应用程序也需要是系统应用程序,对吗?我说的是 android 6 及以上版本... 为什么不可行?为我工作。我需要测试以在位置模式之间切换,所以我在 UNrooted Galaxy S6 上安装了我的应用程序,运行“adb shell pm grant android.permission.WRITE_SECURE_SETTINGS”,它完成了这项工作(手机第一次弹出对话框但随后,模式一直切换到“高精度”模式,)。 不过,对于大多数 Android 应用来说,这不是一个可行的解决方案。【参考方案3】:

根据上面的@user2450263注释,这里有一些sn-ps,

/**
 * 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);

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

【讨论】:

googleclient api 已弃用,另一种解决方案是什么,我想打开 gps 并获取纬度、经度而无需设置。请指导我

以上是关于以编程方式启用定位模式高精度或省电,无需用户访问设置的主要内容,如果未能解决你的问题,请参考以下文章

Android中的省电模式以编程方式控制?

省电的iPhone定位

暂时启用定位高精度模式

以 Android 编程方式启用 GPS(无需导航到位置设置)

如何以编程方式找出打开了哪种位置模式?

禁用或检测应用特定的省电模式