web-dev-qa-db-ja.com

設定で設定せずにモックの場所を使用する

私は、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セキュア設定が必要です

6
lukassteiner

問題の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に移動します

私のプロジェクトで試してみましたが、問題なく動作しました。

14
PageNotFound

そのためには、デバイスへのrootアクセスが必要です。

2
jaaaawn

これを試してください http://repo.xposed.info/module/com.brandonnalls.mockmocklocations

一部のアプリでは、位置を模擬していない場合でも、[模擬位置を許可する]がオンになっていると使用できません。これにより、アプリが「模擬場所を許可する」がオンになっていることを検出できなくなります。

2
gonjay