1

場所をモックするアプリを作成し、実行時に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;
        }
    }

助けて修正してください。もしあれば、より良い解決策を提案してください。事前に感謝します

4

0 に答える 0