Мое текущее местоположение всегда возвращает null. Как я могу это исправить?

Я пытаюсь найти свое текущее местоположение для проекта Android. Когда приложение загружается, мое текущее местоположение всегда равно нулю. Я установил разрешения в манифесте и т. Д. Когда я нахожу текущее местоположение, я намереваюсь использовать координаты, чтобы найти расстояния до других мест на карте. Ниже приведен фрагмент кода. Почему я всегда получаю нулевое значение?

locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria crit = new Criteria(); towers = locMan.getBestProvider(crit, false); location = locMan.getLastKnownLocation(towers); if (location != null) { System.out.println("Location is not null!"); lat = (int) (location.getLatitude() *1E6); longi = (int) (location.getLongitude() * 1E6); GeoPoint ourLocation = new GeoPoint(lati, longi); OverlayItem overlayItem = new OverlayItem(ourLocation, "1st String", "2nd String"); CustomPinpoint custom = new CustomPinpoint(d, MainMap.this); custom.insertPinpoint(overlayItem); overlayList.add(custom); overlayList.clear(); } else { System.out.println("Location is null! " + towers); Toast.makeText(MainMap.this, "Couldn't get provider",Toast.LENGTH_SHORT) .show(); } 

Solutions Collecting From Web of "Мое текущее местоположение всегда возвращает null. Как я могу это исправить?"

getLastKnownLocation() использует местоположения, ранее найденные другими приложениями. Если ни одно приложение не сделало этого, то getLastKnownLocation() вернет значение null.

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

 private Location getLastKnownLocation() { List<String> providers = mLocationManager.getProviders(true); Location bestLocation = null; for (String provider : providers) { Location l = mLocationManager.getLastKnownLocation(provider); ALog.d("last known location, provider: %s, location: %s", provider, l); if (l == null) { continue; } if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) { ALog.d("found best last known location: %s", l); bestLocation = l; } } if (bestLocation == null) { return null; } return bestLocation; } 

Если ваше приложение не может иметь дело без местоположения, и если нет последнего известного местоположения, вам нужно будет слушать обновления местоположения. Вы можете взглянуть на этот класс для примера,

https://github.com/farble1670/autobright/blob/master/src/org/jtb/autobright/EventService.java

См. Метод onStartCommand() , где он проверяет, включен ли сетевой провайдер. Если нет, он использует последнее известное местоположение. Если он включен, он регистрируется для получения обновлений местоположения.

Если u найти текущее местоположение устройств, используйте следующий метод в основном классе

 public void find_Location(Context con) { Log.d("Find Location", "in find_location"); this.con = con; String location_context = Context.LOCATION_SERVICE; locationManager = (LocationManager) con.getSystemService(location_context); List<String> providers = locationManager.getProviders(true); for (String provider : providers) { locationManager.requestLocationUpdates(provider, 1000, 0, new LocationListener() { public void onLocationChanged(Location location) {} public void onProviderDisabled(String provider) {} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }); Location location = locationManager.getLastKnownLocation(provider); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); addr = ConvertPointToLocation(latitude, longitude); String temp_c = SendToUrl(addr); } } } 

И Add User Permission в файле манифеста

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

Вы пытались изменить код? Например, если (location == null), то напечатайте это местоположение равным null, а другое место печати не равно нулю. Однажды я получил эту проблему, и это, похоже, исправило ее (я не знаю почему). Попробуй это.

Если это не сработает, возможно, API карт google возвращает нулевое значение, и в этом случае это проблема с GM-API или с помощью метода вызова. Любая из этих проблем может быть проблемой.

Надеюсь это поможет,

-JXP

Попробуйте это, это не даст вам нулевое текущее местоположение

 class GetLastLocation extends TimerTask { LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); LocationListener mlocListenerTmp = new CustomLocationListener(); private final Handler mLocHandler; public GetLastLocation(Handler mLocHandler) { this.mLocHandler = mLocHandler; } @Override public void run() { timer.cancel(); mlocManager.removeUpdates(mlocListenerTmp); Location location = mlocManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); { if (mlocListenerTmp != null) { mlocManager.removeUpdates(mlocListenerTmp); } currentLocation = location; } if (location != null) { String message = String.format( "Location \n Longitude: %1$s \n Latitude: %2$s", location.getLongitude(), location.getLatitude()); Log.d("loc", " :" + message); Bundle b = new Bundle(); { b.putBoolean("locationRetrieved", true); { Message msg = Message.obtain(); { msg.setData(b); mLocHandler.sendMessage(msg); } } } } else { Log.d( "loc", ":No GPS or network signal please fill the location manually!"); location = mlocManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { currentLocation = location; Bundle b = new Bundle(); { b.putBoolean("locationRetrieved", true); { Message msg = Message.obtain(); { msg.setData(b); mLocHandler.sendMessage(msg); } } } } else { Bundle b = new Bundle(); { b.putBoolean("locationRetrieved", false); { Message msg = Message.obtain(); { msg.setData(b); mLocHandler.sendMessage(msg); } } } } } } } 

Назовите это так

 timer.schedule(new GetLastLocation(mLocHandler), 3000); 

И customLocationclass выглядит следующим образом

 public class CustomLocationListener implements LocationListener { @Override public void onLocationChanged(Location loc) { loc.getLatitude(); loc.getLongitude(); currentLocation = loc; String Text = "My current location is: " + "Latitud = " + loc.getLatitude() + "Longitud = " + loc.getLongitude(); Log.d("loc", "onLocationChanged" + Text); } @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status, Bundle extras) {} } 

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