Android - 以编程方式打开或关闭 GPS

Android - turn GPS on or off programmatically

为什么我们需要为 on/off GPS 进行设置,另一方面我们可以 on/off WIFI 和蓝牙以编程方式进行设置,而无需移动到设置。 Android 指南在 4.0 版以上发生了变化。对于 4.0 以上的版本,您无法以编程方式关闭 GPS。

你的问题前提已经不正确了。使用 Google Play Services 7,您可以显示一个对话框以在您的应用程序中更改位置提供程序设置。跳转到 this video 中的 1:10。

曾经有一种方法可以通过发送 android.location.GPS_ENABLED_CHANGE 广播以编程方式启用/禁用 GPS:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", enabled);
sendBroadcast(intent);

其中 enabled 分别为 truefalse

如果你看一下 this bug report,这个 hack 在 Android 4.4 中被颠覆了。它仍然适用于旧的 OS 版本。

现在回答你的问题

Why we need to go setting for on/off GPS on the other hand we can on/off WIFI and Bluetooth programmatically without move to settings ?

Android 的 GPS 技术会定期向 Google 发送位置数据,即使没有第三方应用程序实际使用 GPS 功能也是如此。 很多人对实时位置监控等事情非常敏感。这就是为什么Google强制要求在使用 GPS 功能之前征得用户的同意。每当用户打开 GPS 时都会看到以下对话框:

因此不再可能以编程方式 更改 GPS 设置,因为这需要用户的许可。程序员 可以 做的是通过调用

将用户引导至 GPS 设置
startActivity(context, new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));

让用户做出选择。

有趣的一点是,如果您尝试在新的 OS 版本上发送 GPS_ENABLED_CHANGE 广播,您会得到

java.lang.SecurityException: Permission Denial: 
    not allowed to send broadcast android.location.GPS_ENABLED_CHANGE

错误。如您所见,它是一个带有 权限拒绝 消息的 SecurityException