2013-10-16 1 views
3

본인은 GPS를 유도 할 수있는 간단한 클래스 GPSListener 좌표가 내 활동 : 나는 응용 프로그램을 실행할 때마다안드로이드 위치 서비스를 업데이트하지 requestLocationUpdates

LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    LocationListener mlocListener = new GPSListener(); 

    Criteria criteria = new Criteria(); 
    String bestProvider = mlocManager.getBestProvider(criteria, false); 
    mlocManager.requestLocationUpdates(bestProvider, 0, 0, mlocListener); 

    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 

    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      lat = GPSListener.latitude; 
      lon = GPSListener.longitude; 
      Log.d("GPS", "lat: "+lat+" long:"+lon); 
    } else { 
      // TODO: GPS not enabled 
      Log.d("GPSERROR", "GPS not enabled"); 
    } 

하지만 내 활동 latlon은 항상 0입니다. 나는이 문제를 해결하는 방법을 잘 모른다.

로깅 : 활동이 시작된 후

Log.d("GPSLISTENER ", "lat: "+latitude+" long:"+longitude); 

올바른 위도 및 경도를 반환은 단지 1 ~ 2 초 걸린다.

Log.d("GPSSUCCESS", "lat: "+lat+" long:"+lon); 

둘 모두에 대해 0.0 만 반환됩니다. 나는 .requestLocationUpdates이 if 문이 실행되기 전에 latlon으로 값을 전달할 것이라는 인상을 받았다. 이것을 어떻게 할 수 있습니까?

+0

실행하는 위치 얻기 위해 (android.permission.ACCESS_FINE_LOCATION) 위치에 대한 매니페스트 파일에 있습니까? – prijupaul

+0

@prijupaul 예. –

+0

에뮬레이터에서 테스트 중이라면 좌표를 전달해야합니다. 그렇지 않으면 장치를 다시 시작하고 확인하십시오. – Shrikant

답변

2

위도, 경도 공용 정적 필드를 사용하고 있습니다.

인스턴트 객체와 비 정적와 setter를 사용하여, 게터로 변경하십시오

lat = mlocListener.getLatitude(); 
lon = mlocListener.getLongitude(); 
+0

행운이 없습니다. 여전히 같은 문제. –

+0

대체 할 수 있습니다 : mlocManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, mlocListener); by : 위치 loc = mlocManager.getLastKnownLocation (LocationManager.GPS_PROVIDER); –

+0

아마도 나는 조금 혼란스러워합니다. 코드를 조금 더 자세히 설명해 주시겠습니까? –

0

을 locationManager 캐시에서 마지막으로 알려진 위치를 사용합니다. 캐시는 Google지도를로드 할 때 업데이트됩니다. 이걸 시험해보고 밖으로 나가서 위치를 확인하십시오. 약 200m 정도 다른 위치로 이동하고 위치를 다시 확인하십시오. 그것은 이전 것과 동일합니다. 이제 Google지도를로드하면 응용 프로그램이 마술처럼 새로운 위치에 있다는 것을 알 수 있습니다.

프로그래밍 방식으로 캐시를 최신 위치로 걷어차 야합니다. 이를 수행 할 수있는 유일한 방법은

YOUR_APPLICATION_CONTEXT.getLocationManager().requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() { 
    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
    @Override 
    public void onProviderEnabled(String provider) { 
    } 
    @Override 
    public void onProviderDisabled(String provider) { 
    } 
    @Override 
    public void onLocationChanged(final Location location) { 
    } 
}); 
1

Google의 위치 처리 로직을 업데이트했습니다. 통합 된 위치 제공 업체를 통해 위치 업데이트를 청취하는 것이 더 쉬워졌습니다. 5 분 안에 위치 수신기를 구현할 수 있습니다. 보세요. Methods for getting the most accurate location

GPS 수신기 만 수신 중이며 아직 준비가되지 않았으며 (위치 상태를 기다리는 중임) 위치를 반환하지 않습니다. 융합 된 위치 제공자를 살펴보고 위치 수신기를 다시 작성하십시오.

1

이 시도 ...

mGoogleMap.setOnMyLocationButtonClickListener(new OnMyLocationButtonClickListener() { 

      @Override 
      public boolean onMyLocationButtonClick() 
       { 
        try 
         { 
          Location myLocation = mGoogleMap.getMyLocation(); 
          onLocationChanged(myLocation); 

         } 
        catch (Exception e) 
         { 
          Log.getStackTraceString(e); 
         } 

        return false; 
       } 
     }); 

사용자가이 Handler가

private Handler customHandler = new Handler(); 


    private Runnable updateTimerThread = new Runnable() { 

    @Override 
    public void run() 
     { 
      try 
       { 

        Location myLocation = mGoogleMap.getMyLocation(); 
        secndLocationListener.onLocationChanged(myLocation); 
       } 
      catch (Exception e) 
       { 
        Log.getStackTraceString(e); 
       } 

     } 
}; 

당신이 권한을 추가나요이

customHandler.postDelayed(updateTimerThread , 1000); 
관련 문제