私は、Androidでロケーションのモックの可能性を利用するアプリを書いています。
私が達成したいのは、開発者オプションで「モックの場所を許可する」フラグを設定せずに自分の場所をモックすることです。
これはこのアプリで動作するため、可能であることはわかっています。 https://play.google.com/store/apps/details?id=com.lexa.fakegps&hl=en
私が試したこと:
Apkを生成して/ system/appに移動し、再起動します
また、マニフェストにACCESS_MOCK_LOCATION権限がある場合とない場合も試してみました。
しかし、それはすべてこの例外につながります:
RuntimeException:アクティビティを開始できません:SecurityException:ACCESS_MOCK_LOCATIONセキュア設定が必要です
問題のcom.lexa.fakegps
を逆コンパイルしました。
private int setMockLocationSettings() {
int value = 1;
try {
value = Settings.Secure.getInt(getContentResolver(),
Settings.Secure.ALLOW_MOCK_LOCATION);
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.ALLOW_MOCK_LOCATION, 1);
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
private void restoreMockLocationSettings(int restore_value) {
try {
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.ALLOW_MOCK_LOCATION, restore_value);
} catch (Exception e) {
e.printStackTrace();
}
}
/* every time you mock location, you should use these code */
int value = setMockLocationSettings();//toggle ALLOW_MOCK_LOCATION on
try {
mLocationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, fake_location);
} catch (SecurityException e) {
e.printStackTrace();
} finally {
restoreMockLocationSettings(value);//toggle ALLOW_MOCK_LOCATION off
}
これらのコードの実行時間は非常に短いため、他のアプリはALLOW_MOCK_LOCATIONの変更をほとんど検出できません。
また、あなたは必要です、
1。デバイスへのrootアクセスを必要とする
2。アプリを/system/app
または/system/priv-app
に移動します
私のプロジェクトで試してみましたが、問題なく動作しました。
そのためには、デバイスへのrootアクセスが必要です。
これを試してください http://repo.xposed.info/module/com.brandonnalls.mockmocklocations
一部のアプリでは、位置を模擬していない場合でも、[模擬位置を許可する]がオンになっていると使用できません。これにより、アプリが「模擬場所を許可する」がオンになっていることを検出できなくなります。