如何在安卓编程中启用GPS

7

可能是重复问题:
如何像Tasker一样在程序中启用GPS

好的,我知道之前有同样的问题,但所有的答案都是“不行”。已经证明可以通过编程来启用GPS。不相信?试试一个叫做“LOOKOUT”的应用程序。我相信有一些变通方法可以实现这一点。

我已经阅读了Lookout的AndroidManifest.xml文件,发现他们只使用了

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

有人知道他们是如何做到这一点的吗?背后的秘密是什么?我个人只有在将应用程序安装为系统应用程序并且需要两个权限时才能做到这一点。

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>

我的代码:

Settings.Secure.setLocationProviderEnabled(getContentResolver(), LocationManager.GPS_PROVIDER, true);

谢谢。

1个回答

9
根据Lookout支持论坛上的这篇文章,他们无法通过编程方式启用GPS。

如果Lookout可以远程启用GPS接收器,然后使用服务,最后关闭它 - 我们会这样做,但不幸的是没有“除了Lookout之外禁用GPS”的选项,如果您已经禁用了GPS接收器,则没有应用程序能够使用它。 启用GPS接收器需要用户手动操作。

编辑:看起来在新版Lookout中,他们很可能利用了一个安全漏洞来实现此目的。 不能保证它会继续工作,但根据2010年4月的Android公开错误报告,类似以下代码将成功地通过编程方式启用/禁用GPS(至少在修复漏洞之前):

private void toggleGPS(boolean enable) {
    String provider = Settings.Secure.getString(getContentResolver(), 
        Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(provider.contains("gps") == enable) {
        return; // the GPS is already in the requested state
    }

    final Intent poke = new Intent();
    poke.setClassName("com.android.settings", 
        "com.android.settings.widget.SettingsAppWidgetProvider");
    poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
    poke.setData(Uri.parse("3"));
    context.sendBroadcast(poke);
}

此外,还可以查看问题“如何像Tasker一样通过编程方式启用GPS”XDA主题链接,了解更多人们如何使用这种方法的讨论。

如果您使用此方法,请向潜在用户明确说明,因为这是一个巨大的潜在隐私问题。


是的,那是旧版本。但在新版本中这是可能的。请查看他们的帮助页面 https://www.mylookout.com/help/ 你能远程打开GPS吗? 可以! Lookout 尽可能高效地利用 Android 手机的 GPS 接收器。当请求定位 Android 设备时,Lookout 可以在定位运行时远程打开 GPS,然后再将其关闭(定位可能需要几分钟才能获得最佳位置结果)。这有助于节省手机电池寿命。只有在明确请求时,Lookout 才使用 GPS 获取您的位置。 - Jason
我个人也进行了测试。它有效。 - Jason
我刚刚在一个已经root的设备上尝试了一下,我可以确认它似乎能够启用GPS(即使完成后仍然保持启用状态)。我想知道他们是否仍然能够在未root的设备上实现。你有没有在未root的手机上尝试过? - Brian
嗨,布赖恩,是的,它也适用于非root手机。因为在启用过程中没有请求root权限。 - Jason
我最终通过这种方式解决了问题。当然,无法通过编程的方式打开/关闭GPS。请尝试以下代码。 final Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.Settings$LocationSettingsActivity")); mContext.startActivity(intent); - theWook
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接