以编程方式启用定位模式高精度或省电,无需用户访问设置
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根据上面的@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 并获取纬度、经度而无需设置。请指导我以上是关于以编程方式启用定位模式高精度或省电,无需用户访问设置的主要内容,如果未能解决你的问题,请参考以下文章