如何在Android Mock Location
中使用Marshmallow
检测位置是否已触发?
以前,我使用过Settings.Secure.ALLOW_MOCK_LOCATION
但是,在API级别23中,这已被弃用。
我想检查触发器是否位于假位置或原始GPS?
现在,检查Mock Location
是否已启用Android Marshmallow
的替代方法是什么?
答案 0 :(得分:12)
如果您正在使用FusedLocationProviderApi
并在回调/ pendingIntentCallback中使用setMockLocation(mGoogleApiClient, fakeLocation);
设置了模拟位置,则返回的Location
对象包含KEY_MOCK_LOCATION
extra,一个布尔值表示已收到对象是模拟的。
@Override
public void onLocationChanged (Location location){
Bundle extras = location.getExtras();
boolean isMockLocation = extras != null && extras.getBoolean(FusedLocationProviderApi.KEY_MOCK_LOCATION, false);
}
答案 1 :(得分:7)
接受的答案是一个有效的解决方案,但是,为了完整起见,我想补充一些观点。
检测模拟位置的最佳内置方法(不仅仅是自Marshmallow以来,但自API 18+开始)将使用Location.isFromMockProvider(),如其他答案和评论中所述。
我在不同的设备和操作系统版本上广泛试验了模拟位置,并得出以下结论:
KEY_MOCK_LOCATION
额外信息与.isFromMockProvider()
具有完全相同的信息,即.isFromMockProvider()
在额外信息出现时返回true
,false
时事实并非如此。换句话说,它没有提供附加价值,只是一种更复杂的方法,可以找出某个位置是否被其提供商标记为模拟。有关详细信息,请参阅here
所以我肯定会建议使用.isFromMockProvider()
。
额外和吸气者都可以零星地返回假阴性,即所讨论的位置是模拟但未标记为此类。对于某些用例来说,这显然非常糟糕。如果您想了解更多信息,我已就此主题撰写了详细的blog post。
在与Android位置(以及模拟标签问题)挣扎了很长一段时间后,我发布了LocationAssistant,这是一个实用程序类,可以在API 15+的非根设备上可靠地拒绝模拟位置。它还使您免受大多数 FusedLocationProvider 样板的负担。也许您会发现它对您的下一个位置感知应用项目很有用。
答案 2 :(得分:6)
This answer似乎不适合我。 extras.getBoolean(FusedLocationProviderApi.KEY_MOCK_LOCATION, false)
总是返回false。
然而,我这样做了:
@Override
public void onLocationChanged (Location location){
boolean isMockLocation = location.isFromMockProvider();
}
我开始得到正确的结果。
答案 3 :(得分:3)
在marshmallow中,您可以使用AppOpsManager检查mock_location。
这里的类似答案:How to read selected mock location app in Android M - API 23