2016-12-17 1 views
8

사용자가 현재 위치를 조롱해야하는 Android 앱이 있습니다. 아래 코드는 사용자가 녹색 버튼을 눌러 위치를 조롱하게하는 코드입니다.Android : 모의 위치가 몇 초 후에 원래 위치로 돌아갑니다.

아래의 코드는 "녹색 버튼"을 누르면 위치가 위조되기 시작합니다.

greenButton.setOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View view) { 
     LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     lm.addTestProvider(LocationManager.GPS_PROVIDER, 
       "requiresNetwork" == "", 
       "requiresSatellite" == "", 
       "requiresCell" == "", 
       "hasMonetaryCost" == "", 
       "supportsAltitude" == "", 
       "supportsSpeed" == "", 
       "supportsBearing" == "", 
       Criteria.POWER_LOW, 
       Criteria.ACCURACY_FINE); 

     Location newLocation = new Location(LocationManager.GPS_PROVIDER); 
     newLocation.setLatitude(fakeLocation.getLatitude()); 
     newLocation.setLongitude(fakeLocation.getLongitude()); 
     newLocation.setAccuracy(fakeLocation.getAccuracy()); 
     newLocation.setTime(System.currentTimeMillis()); 
     newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 
     lm.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true); 
     lm.setTestProviderStatus(LocationManager.GPS_PROVIDER, 
       LocationProvider.AVAILABLE, 
       null, System.currentTimeMillis()); 
     lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation); 
     } 
}); 

지도에 마커를 놓고 녹색 버튼을 누릅니다. 위치 조롱이 시작됩니다. 그 "가짜 위치"가 나의 현재 위치가됩니다.

그러나 10-20 초 후에 조롱은 끝납니다. 내 "실제 위치"가 현재 위치가됩니다. 온라인에서 많은 예제를 보았고 위치를 조롱하기 위해 사용하는 것과 동일한 코드를 사용합니다. 나는 왜 이것이 내 애플 리케이션과 함께 발생하는지 모르겠다. 어떤 도움을 주시면 감사하겠습니다.

답변

2

먼저 위치 요청은 적절한 위치 제공 업체의 모의 위치에 영향을 미칩니다.

GPS 제공 업체의 모의 위치를 ​​만들고 설정 한 다음 GPS 제공 업체에 대한 위치 요청을 다시 수행하면 GPS 하드웨어가 새로운 위치를 수신 할 때까지 모의 것을 지속합니다. 이것은 10-20 초 또는 그 이상이 걸릴 수 있습니다. (10-20 초 후에 조롱은 끝납니다 ...)

또한이 질문은 가짜 위치 응용 프로그램의 문제에 대한 답변입니다. "이 앱을 사용한 후에 실제 위치를 얻을 수 없습니다 !!!"와 같은 댓글을 볼 수 있습니다. 시장에. 그들이 한 것처럼 위치 요청을해야하기 때문입니다.

마지막으로 조업 작업을 반복하십시오. 백그라운드 스레드에서 수행하는 것이 좋습니다. 어쩌면 각각 1 또는 2 초마다 수행하는 것이 좋습니다. 이렇게하면 다른 응용 프로그램의 위치 요청에 대한 영향을 줄일 수 있습니다.

Handler mHandler; 

private void loopMocking(){ 
    mHandler.post(mMockRunnable); 
} 

private Runnable mMockRunnable = new Runnable() { 
    @Override 
    public void run() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 
     } 

     newLocation.setTime(System.currentTimeMillis()); 
     lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation); 

     mHandler.postDelayed(mMockRunnable, 1000); // At each 1 second 
    } 
}; 
+0

완벽하게 작동했습니다. 고맙습니다 –

-1

참조하십시오.

manager.removeUpdates (this)를 사용하십시오. documentation은 다음과 같이 말합니다 :

현재 활동의 위치 업데이트에 대한 현재 등록을 지정된 LocationListener로 제거합니다. 이 호출 후에이 수신기에 대한 업데이트가 더 이상 발생하지 않습니다. 따라서 모의 위치는 그대로 유지됩니다.

관련 문제