Android Marshmallow
のMock Location
で場所がトリガーされたかどうかを検出する方法は?
以前はSettings.Secure.ALLOW_MOCK_LOCATION
を使用していました
ただし、APIレベル23では、これは廃止されました。
トリガーが偽の場所にあるのか、元のGPSにあるのかを確認したいのですが?
さて、Mock Location
が有効になっているかどうかを確認する代替手段は何ですかAndroid Marshmallow
?
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);
}
受け入れられた答えは実用的な解決策ですが、私は完全性のためにいくつかのポイントを追加したいと思います。
模擬場所を検出するための最良の組み込み方法(マシュマロ以降だけでなく、API 18+以降)は Location.isFromMockProvider() を使用することです。他の回答やコメントで。
さまざまなデバイスとOSバージョンでモックの場所を広範囲にわたって実験し、次の結論に達しました。
_KEY_MOCK_LOCATION
_エキストラは、.isFromMockProvider()
とまったく同じ情報を持ちます。つまり、.isFromMockProvider()
は、エキストラが存在する場合はtrue
を返し、次の場合はfalse
を返します。そうではありません。言い換えると、それは付加価値を提供せず、個々の場所がそのプロバイダーによってモックとしてラベル付けされているかどうかを見つけるより複雑な方法にすぎません。詳細は here を参照してください。
そのため、.isFromMockProvider()
の使用をお勧めします。
エキストラとゲッターの両方が散発的に偽陰性を返す可能性があります、つまり、問題の場所はモックですが、そのようにラベル付けされていません。これは明らかに、特定のユースケースにとって本当に悪いことです。詳細については、この件について詳細な ブログ投稿 を記載しました。
Android場所(およびモックのラベル付けの問題)とかなり長い間苦労した後、私は LocationAssistant を公開しました。非ルート上のモックの場所を確実に拒否するユーティリティクラスですAPI 15+を備えたデバイスです。また、FusedLocationProviderボイラープレートのほとんどから負荷がかかりません。おそらく、次の位置認識アプリプロジェクトに役立つでしょう。
この答え は私にはうまくいかなかったようです。 extras.getBoolean(FusedLocationProviderApi.KEY_MOCK_LOCATION, false)
は常にfalseを返しました。
しかし、私はこれをしました:
@Override
public void onLocationChanged (Location location){
boolean isMockLocation = location.isFromMockProvider();
}
そして、私は正しい結果を得始めました。
Marshmallowでは、AppOpsManagerを使用してmock_locationを確認できます。
ここで同様の答え: Android M-API 23 で選択した模擬場所アプリを読み取る方法