2014-06-24 2 views
2

Google Play 서비스 API를 사용하여 현재 위치를 가져 오는 서비스가 있습니다. 하지만 onLocationChanged는 서비스가 시작될 때 한 번만 호출됩니다. 위치 스푸핑을 사용하여 새 위치에서 속임수를 쓰더라도 onLocationChanged를 호출해야합니다.Google Play 서비스 위치 API : onLocationChanged는 한 번만 호출됩니다.

나는 위치 스푸핑 소프트웨어가 활성화 될 때가했던 서비스가 나에게 가짜 위치를주고 다시 시작할 때 위치 스푸핑이 올바르게 B/C를하고있다 확신합니다. 또한 mLocationRequest에 interval과 fastInterval을 설정했습니다. 나 또한 내 매니페스트에 추가했습니다.

내가 대신 ACCESS_FINE_LOCATION 및 PRIORITY_HIGH_ACCURACY을 사용했습니다. 이 변경을 한 경우 고정 된 것으로 보이지만 서비스가 연중 무휴로 실행되도록 설계되었으므로이 응용 프로그램에 GPS를 사용하지 않아야합니다.

여기 내 코드의 일부 :

public MyService extends Service { 
     //.....Other part... 
     public void geolocationScanInit() { 
       serviceEnableStatus = true 
       mLocationRequest = LocationRequest.create(); 
       mLocationRequest.setInterval(LOCATION_UPDATE_INTERVAL); 
       mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
       mLocationRequest.setFastestInterval(FAST_INTERVAL_CEILING); 

       locationCallbacks = new LocationCallbacks(this, mLocationRequest); 
    } 
} 

을 그리고 이것은 내가 유래를 검색 한 그러나 유사한 질문을 찾을 수없는

public class LocationCallbacks implements LocationListener, GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener { 

    private final String TAG = "LocationService"; 

    private LocationRequest mLocationRequest; 
    private LocationClient mLocationClient; 
    private MyService mService; 

    public LocationCallbacks(MyService ms, 
     LocationRequest locReq) { 
     mService = ms; 
     mLocationRequest = locReq; 
     mLocationClient = new LocationClient(mService, this, this); 
     mLocationClient.connect(); 
    } 

    public void startLocationUpdate() { 
     mLocationClient.requestLocationUpdates(mLocationRequest, LocationCallbacks.this); 
    } 

    public void stopLocationUpdate() { 
     if (mLocationClient != null && mLocationClient.isConnected()) { 
      mLocationClient.removeLocationUpdates(this); 
     } 
    } 

    @Override 
    public void onConnected(Bundle arg0) { 
     Log.w(TAG, "onConnected"); 
     startLocationUpdate(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     mService.recievedLocationChanged(new GlobalLocation(location.getLatitude(), location.getLongitude())); 
    } 

} 

을 디자인 LocationCallbacks 클래스입니다. Google Play 서비스의 대부분의 애플리케이션에서 Service와 LocationCallback을 함께 사용하는 것처럼 보이지만 현재 위치를 알아내는 것은 실제로 내 서비스에서 기능 중 하나 (실제로는 가장 중요하지 않은 기능) 중 하나이므로 내 애플리케이션에서 의미가 없습니다. 그리고 그것이 문제가 될지 의심 스럽습니다.

감사합니다.

============================================== ==========

업데이트 :

나는이 질문에 대한 몇 가지 단서가있을 수 있습니다 생각합니다.

찾았습니다. onLocationChanged just called once using network provider API는 다르지만 연결되어있을 수 있습니다. 그게 사실이라면 내가 원하는 것을하기가 어려울 것 같습니다.

게다가, 내 테스트를 통해, 나는 서비스가 실제로 onLocationChanged 호출하는 것으로 나타났다. 단지 LOCATION_UPDATE_INTERVAL과 FAST_INTERVAL_CEILING을 따르지 않는 매우 낮은 빈도로 업데이트합니다 (각각 8000ms와 2000ms로 설정). 현재 10 분 이상에 한 번 업데이트됩니다.

그러나 나는 아직도 내가 원하는 것을 얻기위한 해결책을 모른다. 어떠한 제안?

타이머 나 비슷한 것을 사용하여 수동으로 위치를 요청하면 좋은 생각일까요?

답변

4

나도 같은 문제를 겪었고 다행히도 나를 위해 일했습니다. 시도 및 실행 방법을 4 시간 걸렸습니다.

IT는 locationClient.requestLocationUpdates(locationRequest, this); 위치 변경에 대한 업데이트를 가져 오는시기로 결정 요인을 필요로 보인다.

이 요소는 LocationClient에 전달 된 LocationRequest 객체의 요소입니다.

onLocationChanged(Location loc)을 트리거하기 위해 이미 지정된 위치를 setSmallestDisplacement(float meters)과 결합하여 마지막 위치에서 미터 단위로 거리를 측정 해보십시오.

귀하의 LocationRequest 지금

mLocationRequest = LocationRequest.create(); 
mLocationRequest.setInterval(LOCATION_UPDATE_INTERVAL); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
mLocationRequest.setFastestInterval(FAST_INTERVAL_CEILING); 
mLocationRequest.setSmallestDisplacement(10); //10 meters 

이 너무 당신을 위해 트릭을 않는 경우 알려 주시기 바랍니다, 다음과 같이됩니다. :)

관련 문제