如何在Android编码中启用GPS

Jas*_*son 7 gps android

可能重复:以
编程方式启用GPS,如Tasker

好的,我知道之前有同样的问题,但所有答案都是"不".事实证明,启用GPS可以在编码中完成.不信?尝试一个名为"LOOKOUT"的应用程序.我相信有一些解决方法可以实现这一目标.

我通过了解了AndroidManifest.xml,我发现他们只使用了

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
Run Code Online (Sandbox Code Playgroud)

任何人都知道他们是如何做到这一点的?隐藏的秘密是什么?我个人设法只在应用程序作为系统应用程序安装并且还需要两个权限时才能执行此操作

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
Run Code Online (Sandbox Code Playgroud)

我的代码:

Settings.Secure.setLocationProviderEnabled(getContentResolver(), LocationManager.GPS_PROVIDER, true);
Run Code Online (Sandbox Code Playgroud)

谢谢.

Bri*_*ian 9

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

如果Lookout可以远程启用GPS接收器,然后使用该服务,然后关闭它 - 我们会,但不幸的是没有"禁用除了Lookout以外的所有其他GPS",如果您已禁用GPS接收器,没有应用程序可以使用它的. 启用GPS接收器需要用户手动完成.

编辑: 看起来在新版本的Lookout中,他们现在最有可能利用安全漏洞来实现这一目标.它不能保证继续工作,但根据2010年4月开放的Android bug报告,类似于下面的代码将成功编程方式启用/禁用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);
}
Run Code Online (Sandbox Code Playgroud)

此外,请参阅问题"以编程方式启用GPS,如Tasker"和其中提到XDA线程,以便更多地讨论人们如何使用此方法.

如果您确实使用此方法,则应向应用程序的潜在用户明确说明,因为这是一个巨大的潜在隐私问题.