2014-07-06 2 views
0

Android에서 위치 서비스에 대해 자세히 알아보고 Android 기기를 찾고 위도와 경도를 서버에 보낼 수있는 앱을 만들려고합니다. 나는 잠시 동안 예상대로 모든 것을 작동 시켰지 만 여전히 작은 버그로 인해 괴롭힘을 당하고 있습니다. 처음으로 서버에서 명령을 보내 장치를 찾으면 장치는 같은 날에 몰 았던 길과 같은 최근이지만 오래된 위치를 반환합니다.이전 위치를 사용하는 Android GPS

두 번째로 장치가 서버에서 명령을 수신하면 장치는 정확한 위치를 반환합니다. 여기

는 관련 코드 :

LocationTracker.java 
public class LocationTracker extends Service implements LocationListener { 



    //flag for GPS Status 
    boolean isGPSEnabled = false; 

    //flag for network status 
    boolean isNetworkEnabled = false; 

    boolean canGetLocation = false; 
    Location location; 
    double latitude; 
    double longitude; 

    //The minimum distance to change updates in metters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10*1000; //10,000 meters 

    //The minimum time beetwen updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 10000; // 10,000 minutes 

    //Declaring a Location Manager 
    protected LocationManager locationManager; 



    public void fetchLocation(Context context) { 
     getLocation(context); 
     if (canGetLocation()) 
     { 
      String stringLatitude = String.valueOf(latitude); 
      String stringLongitude = String.valueOf(longitude); 
      Log.i("Location: ", stringLatitude + " " + stringLongitude); 
      new MyAsyncTask().execute(stringLatitude, stringLongitude);  
     } 
     else 
     { 
      // can't get location 
      // GPS or Network is not enabled 
      // Ask user to enable GPS/network in settings 
      Log.i("Error: ", "Cannot get location"); 
     } 
    } 


    public Location getLocation(Context context) 
    { 
     try 
     { 
      locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); 

      //getting GPS status 
      isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      //getting network status 
      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) 
      { 
       // no network provider is enabled 
      } 
      else 
      { 
       this.canGetLocation = true; 



       //if GPS Enabled get lat/long using GPS Services 
       if (isGPSEnabled) 
       { 
        if (location == null) 
        { 
         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

         Log.d("GPS Enabled", "GPS Enabled"); 

         if (locationManager != null) 
         { 
          location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          updateGPSCoordinates(); 
         } 
        } 
       } 

       //If no GPS, get location from Network Provider 
       if (isNetworkEnabled && !isGPSEnabled) 
       { 
        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

        Log.d("Network", "Network"); 

        if (locationManager != null) 
        { 
         location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         updateGPSCoordinates(); 
        } 
       }     


      } 
     } 
     catch (Exception e) 
     { 
      //e.printStackTrace(); 
      Log.e("Error : Location", "Impossible to connect to LocationManager", e); 
     } 

     return location; 
    } 

    public void updateGPSCoordinates() 
    { 
     if (location != null) 
     { 
      latitude = location.getLatitude(); 
      longitude = location.getLongitude(); 
     } 
    } 

    /** 
    * Stop using GPS listener 
    * Calling this function will stop using GPS in your app 
    */ 

    public void stopUsingGPS() 
    { 
     if (locationManager != null) 
     { 
      locationManager.removeUpdates(LocationTracker.this); 
     } 
    } 

    /** 
    * Function to get latitude 
    */ 
    public double getLatitude() 
    { 
     if (location != null) 
     { 
      latitude = location.getLatitude(); 
     } 

     return latitude; 
    } 

    /** 
    * Function to get longitude 
    */ 
    public double getLongitude() 
    { 
     if (location != null) 
     { 
      longitude = location.getLongitude(); 
     } 

     return longitude; 
    } 

    /** 
    * Function to check GPS/wifi enabled 
    */ 
    public boolean canGetLocation() 
    { 
     return this.canGetLocation; 
    } 

    @Override 
    public void onLocationChanged(Location location) 
    { 
     double newLat = location.getLatitude(); 
     double newLong = location.getLongitude(); 
     String stringNewLatitude = String.valueOf(newLat); 
     String stringNewLongitude = String.valueOf(newLong); 
     Log.i("New Location: ", stringNewLatitude + " " + stringNewLongitude); 
     new MyAsyncTask().execute(stringNewLatitude, stringNewLongitude); 
    } 

    @Override 
    public void onProviderDisabled(String provider) 
    { 
    } 

    @Override 
    public void onProviderEnabled(String provider) 
    { 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) 
    { 
    } 

    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 

왜 오래된 위치가 시도 처음으로, 두 번째 시간에 올바른 위치로 내 위치 업데이트?

또한 나 또한 여기에 본 requestLocationUpdates를 제거하려는 있습니다 :

locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 
MIN_TIME_BW_UPDATES, 
MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

을가 죽은 스레드 경고에 핸들러가 발생하기 때문에,하지만 난 그것을 제거 할 때 내 장치 내 위치를 획득 정지. 이것은 문제의 일부일 수 있습니다.

나는 어떤 도움을 주시면 감사하겠습니다!

답변

1

getLastKnownLocation()을 사용하고 있기 때문입니다.

location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

getLastKnownLocation(String Provider) : 지정된 프로 바이더로부터 얻은 마지막으로 알려진 위치 수정의 데이터를 나타내는 위치를 돌려줍니다 .

공급자를 시작하지 않고도이 작업을 수행 할 수 있습니다. 이 위치는 오래된 것일 수 있습니다 (예 : 기기가 꺼지고 다른 위치로 이동 한 경우).

관련 문제