2

Google 스토어에서 'Fake Gps'를 다운로드하여 사용한 후, 나는 교육 목적으로 만들어야한다고 생각했습니다.android 모의 위치가 위치 서비스로 작동하지 않습니다 .fusedlocationapi

GoogleApiClient FusedLocationAPI를 사용하여 현재 위치를 가져오고 모의 위치를 ​​만들었습니다. 현재 위치를 알 수 있지만 위치를 모의 할 수는 없습니다.

public class GoogleApiClientGeoLocation implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 
    private GoogleApiClient googleApiClient; 

    public GoogleApiClientGeoLocation(Context activity) { 
     googleApiClient = new GoogleApiClient.Builder(activity, this, this).addApi(LocationServices.API).build(); 
     .... 
    } 

    public void connect() { 
     if (googleApiClient != null) { 
      googleApiClient.connect(); 
     } 
    } 

    public void disconnect() { 
     googleApiClient.disconnect(); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Log.e("TAG","Location changed"+location.getLatitude() + ", "+ location.getLongitude()); 
    } 

    private static final String PROVIDER = LocationManager.NETWORK_PROVIDER;//"flp"; 
    private static final double LAT = 37.377166; 
    private static final double LNG = -122.086966; 
    private static final float ACCURACY = 3.0f; 

    public Location createLocation(double lat, double lng, float accuracy) { //<-for testing purposes using a static lat,long 
     // Create a new Location 
     Location newLocation = new Location(PROVIDER); 
     newLocation.setLatitude(LAT); 
     newLocation.setLongitude(LNG); 
     newLocation.setAltitude(1000); 
     newLocation.setElapsedRealtimeNanos(System.nanoTime()); 
     newLocation.setTime(System.currentTimeMillis()); 
     newLocation.setAccuracy(500); 
     return newLocation; 
    } 

    public void startMock() { 
     LocationServices.FusedLocationApi.setMockMode(googleApiClient, true); 
    } 
    public void stopMock() { 
     LocationServices.FusedLocationApi.setMockMode(googleApiClient, false); 
    } 
    public void domock() { 
     Location testLocation = createLocation(LAT, LNG, ACCURACY); 
     if (ContextCompat.checkSelfPermission(_context, android.Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 

      LocationServices.FusedLocationApi.setMockLocation(googleApiClient, testLocation); 
      Log.e("TAG","Location Mocked"); 
     }else{ 
      Log.e("TAG","Can not Mock location"); 
     } 
    } 
} 

모든 기능을 처리하는 클래스 GoogleApiClientGeoLocation이 있습니다. 흐름은 초기화 -> 연결 -> 시작 -> 모의 -> 멈춤 -> 연결 해제입니다.

connect()를 수행하면 locationchange()가 현재 위치를 제공하지만 startmock() 및 domock()는 멈추고 아무 것도 반환하지 않으며, stopmock()을 호출하면 locationchange()가 현재 위치를 다시 제공하기 시작합니다.

'위치 조롱'이라는 로그 메시지가 표시됩니다.

제 'PROVIDER'가 잘못 되었습니까?

모의 위치를 ​​만들고 Google지도로 이동하여 모의 위치를 ​​가리킬 수 있기를 원합니다.

답변

0

FusedLocationProvider는 시스템 시계와 다른 시계에 나타납니다. 나는. elapsedRealTimeNanosSystem.nanoTime과 다릅니다. 그래서 시스템 시계를 사용하여 설정 한 시간은 꺼지고 새 위치가 부실하고 유효하지 않은 것으로 간주됩니다.

유효한 elapsedRealTimeNanos을 얻으려면 모의 위치를 ​​만들 때마다 System.nanoTime()에 오프셋을 추가합니다. 다음

Location current = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 
nanoOffset = current.getElapsedRealtimeNanos() - System.nanoTime(); 

그럼, 내가 만든 완전한 모의 위치가 될 때 : 내가 먼저 googleApiClient에 연결할 때 오프셋 계산

Location location = new Location("flp"); // indicates mock 
locationlocation.setLatitude(latLon.getLat()); 
location.setLongitude(latLon.getLon()); 
location.setTime(System.currentTimeMillis()); 
location.setAccuracy(6f); 
location.setElapsedRealtimeNanos(System.nanoTime() + nanoOffset);