2015-02-11 4 views
1

Я использую следующий код, чтобы получить текущее местоположение. Он отлично работает с помощью NETWORK_PROVIDER. Но всякий раз, когда я использую GPS_PROVIDER, он всегда возвращает null. Я знаю, что тот же вопрос задавали много много раз, но ни один из них не решить мою проблемуAndroid getLastKnownLocation (LocationManager.GPS_PROVIDER) возвращает null

public class GPSTracker extends Service implements LocationListener { 
    private final Context mContext; 

    // flag for GPS Status 
    boolean isGPSEnabled = false; 

    // flag for network status 
    boolean isNetworkEnabled = false; 

    boolean canGetLocation = false; 

    android.location.Location location; 
    double latitude; 
    double longitude; 

    // The minimum distance to change updates in metters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 
                    // metters 

    // The minimum time beetwen updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 
                    // minute 

    // Declaring a Location Manager 
    protected LocationManager locationManager; 

    public GPSTracker(Context context) { 
     this.mContext = context; 
     getLocation(); 
    } 

    public android.location.Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext 
        .getSystemService(LOCATION_SERVICE); 

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

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

      if (!isGPSEnabled && !isNetworkEnabled) { 
       // location service disabled 
      } else { 
       this.canGetLocation = true; 

       // if GPS Enabled get lat/long using GPS Services 

       if (isGPSEnabled) { 
        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(); 
        } 
       } 

       // First get location from Network Provider 
       if (isNetworkEnabled) { 
        if (location == null) { 
         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(); 
     } 
    } 

    public boolean canGetLocation() { 
      return this.canGetLocation; 
    } 

    public void onLocationChanged(Location location) { 
    } 

    public void onProviderDisabled(String provider) { 
    } 

    public void onProviderEnabled(String provider) { 
    } 

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

Чтобы получить расположение от других видов деятельности, я просто сделать

GPSTracker gps = new GPSTracker(this); 
double lat = gps.latitude; 
double lon = gps.longitude; 
+0

из-за этого возможно! – Selvin

ответ

1

испытания следующие

public class GPSTracker extends Service implements LocationListener { 
    private final Context mContext; 

    // flag for GPS Status 
    boolean isGPSEnabled = false; 

    // flag for network status 
    boolean isNetworkEnabled = false; 

    boolean canGetLocation = false; 

    android.location.Location location; 
    double latitude; 
    double longitude; 

    // The minimum distance to change updates in metters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; 

    // The minimum time beetwen updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 0; 

    // Declaring a Location Manager 
    protected LocationManager locationManager; 

    public GPSTracker(Context context) { 
     this.mContext = context; 
     getLocation(); 
    } 

    public android.location.Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext 
        .getSystemService(LOCATION_SERVICE); 

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

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

      if (!isGPSEnabled && !isNetworkEnabled) { 
       // location service disabled 
      } else { 
       this.canGetLocation = true; 

       // if GPS Enabled get lat/long using GPS Services 

       if (isGPSEnabled) { 
        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(); 
        } 
       } 

       // First get location from Network Provider 
       if (isNetworkEnabled) { 
        if (location == null) { 
         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(Location location) { 
     if (location != null) { 
      latitude = location.getLatitude(); 
      longitude = location.getLongitude(); 
     } 
    } 

    public boolean canGetLocation() { 
      return this.canGetLocation; 
    } 

    public void onLocationChanged(Location location) { 
    Toast.makeText(getApplicationContext(), Ubicación Obtenida: " + location.toString(), Toast.LENGTH_LONG).show(); 
    updateGPSCoordinates(Location location); 
    } 

    public void onProviderDisabled(String provider) { 
    } 

    public void onProviderEnabled(String provider) { 
    } 

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

Для getLastKnowLocation, сначала GPS нужно найти координаты, лучший способ заключается в использовании метода onLocationChanged, потому что жив, расположение в сети быстрее, чем GPS местоположение внутри здание. Вы можете видеть, что onLocationChanged - это огонь с помощью тоста. После этого вы можете получить последнее местоположение, используя GPS в этом приложении, которое вы строите.

+0

Я пробовал ваш код. Значение поджаривается, когда сетевой провайдер включен, но не получает никакого тоста для провайдера GPS ... Интересно, почему так ??? Даже при установке расстояния и времени до 0, как вы предполагали? –

+0

Вам нужно прогуляться снаружи, чтобы добраться до спутника, пытаетесь ли вы с симулятором или мобильным телефоном? если симулятор у вас никогда не будет координата, по крайней мере, вы используете насмешливое местоположение –

+0

Ohhh .. Thnxxx для предложения .... Попробуем это ... Btw Я запускаю код на своем мобильном устройстве, а не на любом симуляторе –

0

Может GPS пристанищем захвачена это не распространяется координата, по методу «onLocationChanged» вы можете контролировать это, лучший способ узнать это, выходит за пределы здания, которое вы тестируете, и смотрите, что происходит, и если вы хотите совершить прогулку, через секунду координата захвата GPS из спутники. после этого.

public void onLocationChanged(Location location) { 
    this.location = location; 
    updateGPSCoordinates(); 
} 
+0

Спасибо за быстрый ответ. Я попробовал, но все равно возвращает null. Кроме того, я пробовал MIN_DISTANCE_CHANGE_FOR_UPDATES и MIN_TIME_BW_UPDATES со значениями 0, 0, но все тот же результат –

0

просто изменить одну строку

местоположение = locationManager .getLastKnownLocation (LocationManager.GPS_PROVIDER); до

location = locationManager .getLastKnownLocation (LocationManager.PASSIVE_PROVIDER);

Смежные вопросы