1

我正在制作一个模拟位置并在运行时打开和关闭设置 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;
        }
    }

请帮助和纠正我,甚至提出更好的解决方案(如果有的话),并在此先感谢

4

0 回答 0