我正在制作一个模拟位置并在运行时打开和关闭设置 ALLOW_MOCK_LOCATION 的应用程序,所以我希望检测到 ALLOW_MOCK_LOCATION 标志的其他应用程序永远不会将 ALLOW_MOCK_LOCATION 设为 1(true)。
我从这里读到它是可能的并且说足够快,所以其他应用程序几乎无法检测到 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;
}
}
请帮助和纠正我,甚至提出更好的解决方案(如果有的话),并在此先感谢