未从 LocationManager 中清除的 Android 模拟位置提供程序

Posted

技术标签:

【中文标题】未从 LocationManager 中清除的 Android 模拟位置提供程序【英文标题】:Android mock location providers not cleaned from LocationManager 【发布时间】:2011-12-12 10:10:28 【问题描述】:

我遇到了模拟位置提供程序的问题。我有一个需要获取准确有效位置的应用程序,并且我不希望用户能够欺骗它们。所以我检查了模拟位置启用设置,它工作正常。

但是位置提供程序存在问题。如果您启用模拟位置,使用 gps faker 应用程序设置位置,然后禁用模拟位置和所有其他位置提供程序,位置管理器仍然具有对模拟位置提供程序的引用。因此,虽然模拟位置被禁用,但位置管理器告诉我 gps 已启用,并提供模拟位置数据。

我知道您可以从位置管理器中清除测试提供程序,但必须启用模拟位置才能执行此操作

有人遇到过这个问题,或者有解决办法吗?

【问题讨论】:

如果模拟位置被禁用,您是否找到了删除参考的方法? 【参考方案1】:

我想我找到了一种方法来准确读取 GPS/网络提供商是否启用:

ContentResolver contentResolver = context.getContentResolver();
boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled(contentResolver, LocationManager.GPS_PROVIDER);
boolean networkEnabled = Settings.Secure.isLocationProviderEnabled(contentResolver, LocationManager.NETWORK_PROVIDER);

【讨论】:

【参考方案2】:

你确定你打过电话吗:

removeUpdates() removeTestProvider() setTestProviderEnabled() 带假 clearTestProviderEnabled() ?

看看LocationManagerTest 是如何做到的。

// disable mocking. 
Settings.Secure.putString(getContentResolver(),
       Settings.Secure.ALLOW_MOCK_LOCATION, "0");

【讨论】:

调用这些方法的问题是您需要启用模拟位置才能使其工作。我想我可以在我的活动的 onResume 中清除位置管理器,但我没有想要麻烦用户启用模拟位置。 您可以静默启用和禁用此设置,请参阅我的编辑。 哦,酷.. 有机会我会试试这个。没想到你可以禁用这样的系统设置.. 要做到这一点,我需要 WRITE_SECURE_SETTINGS 权限,但我无法获得该权限:***.com/questions/5034160/…

以上是关于未从 LocationManager 中清除的 Android 模拟位置提供程序的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 会话文件未从 framework/sessions 文件夹中清除

Cognito 注销流程未从浏览器中清除 ADFS 的 cookie

有没有办法清除已经从Android设备手动捕获的位置详细信息?

Android之LocationManager

InstallShield 2011 未从服务列表中删除服务

Launcher Activity 未从最近的应用程序启动