1

Я разрабатываю приложение, которое позволяет использовать GPS и получать текущее местоположение. Мой код отлично работает во всех версиях Android, ожидающих API 23, т. Е. Marshmallows. Я тестирую Nexus 5 (API 23), Galaxy Note 3 (API 22).Как получить локацию (lat, lng) в API 23 и выше в Android программно?

Вот мой код

public void program() 
{ 
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new MyLocationListener()); 

    if (!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(NearBy.this); 
     builder.setTitle("Location Service is Not Active"); 
     builder.setMessage("Please Enable your location services").setCancelable(false) 
       .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 

         Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
         startActivity(intent); 

        } 
       }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
     Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 
     List<Address> addresses = null; 
     try { 
      addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); 

      final String cityName = addresses.get(0).getAddressLine(0) + " "; 
      String stateName = addresses.get(0).getAddressLine(1) + " "; 
      String countryName = addresses.get(0).getAddressLine(2) + " "; 
      String country = addresses.get(0).getCountryName() + " "; 
      String Area = addresses.get(0).getSubAdminArea() + " "; 
      String Area1 = addresses.get(0).getAdminArea() + " "; 
      String Area2 = addresses.get(0).getLocality() + " "; 
      String Area3 = addresses.get(0).getSubLocality(); 
      Log.e("Locaton", cityName + stateName + countryName + country + Area + Area1 + Area2 + Area3); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Я получаю NullPointerException в

  addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); 

только в Nexus 5 (API 23). Я также предоставил разрешение (ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION) как в Mainfest, так и во время выполнения.

Просьба предоставить решение для этого.

ОБНОВЛЕНО

Я изменил код. Я создал класс GPSTracker, и я получаю лат, LNG как 0

GPSTracker.java

public class GPSTracker extends Activity implements LocationListener { 
private final Context mContext; 
// flag for GPS status 
boolean isGPSEnabled = false; 
// flag for network status 
boolean isNetworkEnabled = false; 
// flag for GPS status 
boolean canGetLocation = false; 
Location location; // location 
double latitude; // latitude 
double longitude; // longitude 

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 

private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute 

protected LocationManager locationManager; 

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

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


     isGPSEnabled = locationManager 
       .isProviderEnabled(LocationManager.GPS_PROVIDER); 

     isNetworkEnabled = locationManager 
       .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
     if (!isGPSEnabled && !isNetworkEnabled) { 

     } else { 
      this.canGetLocation = true; 
      if (isNetworkEnabled) { 
       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); 
        if (location != null) { 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 
      } 

      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); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return location; 
} 
@TargetApi(Build.VERSION_CODES.M) 
public void stopUsingGPS() { 
    if (locationManager != null) { 
     if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

      return; 
     } 
     locationManager.removeUpdates(GPSTracker.this); 
    } 
} 


public double getLatitude() { 
    if (location != null) { 
     latitude = location.getLatitude(); 
    } 

    return latitude; 
} 

public double getLongitude() { 
    if (location != null) { 
     longitude = location.getLongitude(); 
    } 

    return longitude; 
} 


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


public void showSettingsAlert() { 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

    alertDialog.setTitle("GPS is settings"); 

    alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      mContext.startActivity(intent); 
     } 
    }); 

    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    alertDialog.show(); 
} 

@Override 
public void onLocationChanged(Location currentLocation) { 

    this.location = currentLocation; 
    getLatitude(); 
    getLongitude(); 

} 

@Override 
public void onProviderDisabled(String provider) { 

} 

@Override 
public void onProviderEnabled(String provider) { 


} 

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

} 
} 
+0

Можете ли вы разместить вывод logcat? – cafebabe1991

+0

вы должны проверить разрешение времени выполнения, например if (Build.VERSION.SDK_INT> = 23 && ContextCompat.checkSelfPermission (контекст, android.Manifest.permission.ACCESS_FINE_LOCATION)! = PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission (контекст, android.Manifest.permission.ACCESS_COARSE_LOCATION)! = PackageManager.PERMISSION_GRANTED) { возврат ; } – saeed

+0

GPSTracker.java работал для меня, чтобы получить почтовый индекс - спасибо! – gnB

ответ

2

Проблема

The location obtained may be null if the last know location could not be found due to various reasons. Read about it in the docs [here][2] 

Причина/Как я отлаженный его

  1. getFromLocation не выбрасывает нулевой указатель в соответствии с документацией, поэтому проблема заключается в вашем объекте местоположения.

    Read here about this method

Remedy

Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

Проверьте расположение полученного на предыдущей стадии, NOT NULL, а затем продолжить геокодером.

Фрагмент кода

... 
else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
    Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
    if(location == null) { 
     log.d("TAG", "The location could not be found"); 
     return; 
    } 
    //else, proceed with geocoding. 
    Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 

Получение местоположения - Пример

Read here

Полный код

View it here

+0

Если проблема в моем местоположении, то как я получу lat, lng с этим же кодом на других устройствах, которые работают в API 22 и ниже. На самом деле теперь я создал GPSTracker.java, и я получаю lat и lng как 0 –

+0

@AnishKumar: Это возможно только в других устройствах, если в них было доступно lastKnownLocation. Попробуйте распечатать объект местоположения на этих устройствах, и вы сами увидите – cafebabe1991

+0

Fine @ cafebabe1991. Я скоро сообщу вам. –

0

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

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