場所をモックするアプリを作成し、実行時にALLOW_MOCK_LOCATIONのオンとオフを設定するため、ALLOW_MOCK_LOCATIONフラグを検出する他のアプリがALLOW_MOCK_LOCATIONを1(true)として取得しないことを願っています。
hereから、それは可能であり、十分に高速であると言われているため、他のアプリは ALLOW_MOCK_LOCATION の変更をほとんど検出できません。しかし、私が得たのは、他のアプリがまだALLOW_MOCK_LOCATIONを1(true)としてリードしていることです。
私のデバイスはすでにルート化されていることに注意してください。場所がうまくモックされていることを確認できます。/system/app に移動しようとしましたが、それでもこの問題が発生します。
これは、タイムアウト付きの非同期タスクをディスパッチする定期的なループです(タイムアウトを3ミリに設定しました!!)。
while(RUNNING){
fakeLocation.setAltitude(65.0);
fakeLocation.setAccuracy(Criteria.ACCURACY_FINE);
fakeLocation.setSpeed(0.0f);
fakeLocation.setTime(System.currentTimeMillis());
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
fakeLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
if(locationJellyBeanFixMethod!=null){
try {
locationJellyBeanFixMethod.invoke(fakeLocation);
}catch(Exception ex){}
}
}
new Thread(new Runnable() {
@Override
public void run() {
try {
new MockTask().execute().get(3, TimeUnit.MILLISECONDS);
}catch(TimeoutException e){
changeMockLocationSettings(0);
//Log.d(GLOBAL_VAR.TAG_DEBUG,"Mock location timeout:");
}catch(Exception e){}
}
}).start();
try {Thread.sleep(1500);} catch (InterruptedException e) {}
}
以下は非同期タスクです
private class MockTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... param) {
try {
changeMockLocationSettings(1);
locationManager.setTestProviderLocation(GLOBAL_VAR.PROVIDER_NAME, fakeLocation);
changeMockLocationSettings(0);
//Log.d(GLOBAL_VAR.TAG_DEBUG,"location mocked -> "+fakeLocation);
} catch (Exception ex) {
//Log.d(GLOBAL_VAR.TAG_DEBUG,"Failed to mock location:"+ex.toString());
}
return null;
}
@Override
protected void onPostExecute(Void loc) {}
}
そして最後にALLOW_MOCK_LOCATIONを変更する方法
private boolean changeMockLocationSettings(int value) {
try {
return Settings.Secure.putInt(getApplicationContext().getContentResolver(),Settings.Secure.ALLOW_MOCK_LOCATION, value);
} catch (Exception e) {
Log.d(GLOBAL_VAR.TAG_DEBUG,"Setting allow mock location to "+value+" failed :"+e.toString());
e.printStackTrace();
return false;
}
}
助けて修正してください。もしあれば、より良い解決策を提案してください。事前に感謝します