FusedLocationApi.getLastLocation всегда null

Я хотел бы просто получить местоположение устройства в своем Android-проекте, и для этого я использую подход play-services:

protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder( MainSearchActivity.this ) .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected( Bundle bundle ){ Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if( location == null ){ LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, new LocationListener() { @Override public void onLocationChanged(Location location) { lastLocation = location; } }); } } @Override public void onConnectionSuspended( int i ){ } }) .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed( ConnectionResult connectionResult ){ if( connectionResult.hasResolution() ){ try { // Start an Activity that tries to resolve the error connectionResult.startResolutionForResult(MainSearchActivity.this, CONNECTION_FAILURE_RESOLUTION_REQUEST); }catch( IntentSender.SendIntentException e ){ e.printStackTrace(); } }else{ Utils.logger("Location services connection failed with code " + connectionResult.getErrorCode(), Utils.LOG_DEBUG ); } } }) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } public Location retrieveLastLocation(){ Location loc = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if( loc == null) { } return loc; //TODO: What if loc is null? } 

но переменная loc является ALWAYS null. Это как таковое на разных телефонах, каждый раз. Также lastLocation, который я пытаюсь назначить в onLocationChanged, никогда не изменяется. Всегда null.

Это разрешение, которое я установил для приложения

         

Я просто не понимаю: почему служба LocationServices не может получить позицию? У меня есть все настройки геолокации на всех трех, которые я тестировал: – /

Спасибо за любую помощь

Location Provider плавного Location Provider будет поддерживать только фоновое местоположение, если к нему подключен хотя бы один клиент. Теперь просто включение службы определения местоположения не гарантирует сохранение последнего известного местоположения.

Как только первый клиент подключится, он немедленно попытается получить местоположение. Если ваша деятельность является первым клиентом для подключения, и getLastLocation() вызывается сразу в onConnected() , для этого может не хватить времени для первого местоположения.

Я предлагаю вам сначала запустить приложение «Карты», чтобы было хотя бы некоторое подтвержденное местоположение, а затем протестировать приложение.

Я думаю, что есть небольшой промах, который не отображается мне в показанном коде.

mGoogleApiClient создан, но, похоже, не подключен. Вы можете проверить это, вызвав mGoogleApiClient.isConnected() .

Вы можете просто переопределить метод onStart и вызвать соединение. Или вы можете переопределить onResume() если вы хотите получить доступ к местоположению всякий раз, когда активность ur видна.

  @Override protected void onStart() { super.onStart(); if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } } 

Сначала создайте объект LocationRequest :

  // Create the LocationRequest object mLocationRequest = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(10 * 1000) // 10 seconds, in milliseconds .setFastestInterval(1 * 1000); // 1 second, in milliseconds 

Затем убедитесь, что пользователь предоставил разрешение на использование местоположения. Если это так, requestLocationUpdates местоположение из requestLocationUpdates следующим образом:

 void getLocation() { Location location = null; if (ContextCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); /*TODO!! INSERT CODE TO PROMPT USER TO GIVE PERMISSION*/ } else { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } mLastLocation = location; LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this); } 

Обязательно удалите обновления, если вам нужно только одно место без постоянного мониторинга. Таким образом, вы никогда не получите нулевое Location .

Для получения дополнительной информации перейдите по адресу http://blog.teamtreehouse.com/beginners-guide-location-android .

Если getLastLocation () всегда возвращает значение null, попробуйте этот хак. Я использовал его для решения моей проблемы. Внесите в свою деятельность LocationListener (import com.google.android.gms.location.LocationListener).

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); Context mContext = this; manager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); createLocationRequest(); mGoogleApiClient = new GoogleApiClient.Builder(mContext) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } private void createLocationRequest(){ mLocationRequest = LocationRequest.create(); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationRequest.setInterval(SET_INTERVAL); mLocationRequest.setFastestInterval(FASTEST_INTERVAL); } 

onStart или onResume (я предпочитаю onResume)

 @Override protected void onResume() { super.onResume(); if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER) ) { if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } }else{ // Showyourmesg(); } } @Override protected void onPause() { super.onPause(); if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } } protected void startLocationUpdates(){ LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest,this); } protected void stopLocationUpdates() { LocationServices.FusedLocationApi.removeLocationUpdates( mGoogleApiClient, this); } 

Теперь в методе onLocationChanged проверьте, подключен ли googleApiClient или нет. Если он подключен, отсоедините его и снова подключите.

 @Override public void onLocationChanged(Location location) { Log.d("SplashAct", "LocatinChngListner, loc: " + location.getLatitude() + "," + location.getLongitude()); if (mGoogleApiClient != null) if (mGoogleApiClient.isConnected() || mGoogleApiClient.isConnecting()){ mGoogleApiClient.disconnect(); mGoogleApiClient.connect(); } else if (!mGoogleApiClient.isConnected()){ mGoogleApiClient.connect(); } } 

И, наконец, в вашем методе onConntected ()

 @Override public void onConnected(Bundle bundle) { Log.d("ACTIVITY", "ApiClient: OnConnected"); mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); if (mLastLocation == null){ startLocationUpdates(); // bind interface if your are not getting the lastlocation. or bind as per your requirement. } if (mLastLocation != null){ while (latitude == 0 || longitude == 0){ pDialog.setMessage("Getting Location"); pDialog.show(); latitude = mLastLocation.getLatitude(); longitude = mLastLocation.getLongitude(); if (latitude != 0 && longitude != 0){ stopLocationUpdates(); // unbind the locationlistner here or wherever you want as per your requirement. pDialog.dismiss(); // location data received, dismiss dialog, call your method or perform your task. } } } } 

Мы постоянно пытаемся подключиться к googleApiClient, даже если он уже подключен, чтобы мы могли получить данные lastLocation. Это будет зависеть от интервалов LocationRequest. Вы также можете получить данные о местоположении в onLocationChanged и выполнить свою задачу.

Как сказано в этом сообщении, The Fused Location Provider будет поддерживать только фоновое местоположение, если к нему подключен хотя бы один клиент.

Но мы не хотим запускать приложение «Карты», чтобы получить последнее местоположение, а также не можем сказать, что наши пользователи запускают приложение «Карты», чтобы получить последнее местоположение.

Нам нужно сделать

  1. Мы должны запросить обновление местоположения от FusedLocationProviderClient
  2. Затем мы можем получить последнее местоположение из FusedLocationProviderClient , оно не будет равно null.

Расположение запроса

 LocationRequest mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(60000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); LocationCallback mLocationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult == null) { return; } for (Location location : locationResult.getLocations()) { if (location != null) { //TODO: UI updates. } } } }; LocationServices.getFusedLocationProviderClient(context).requestLocationUpdates(mLocationRequest, mLocationCallback, null); 

Получить последнее местоположение

 LocationServices.getFusedLocationProviderClient(context).getLastLocation().addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Location location) { //TODO: UI updates. } }); 

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

Если вы используете Android Marshmallow (API 23) или более новую версию Android, вы можете столкнуться с такой же проблемой, потому что разрешение не предоставляется . Вы должны либо явно запрашивать разрешение во время выполнения для местоположения, либо, если это тестовый проект, вы можете предоставить разрешение на размещение из настроек приложения на своем телефоне.

Вот точный ответ и объяснение.

LocationClient getLastLocation () return null

Это связано с ответом Амита К. Саха, но для меня на одном из моих устройств Lollipop я все время получал null . Поэтому я открыл приложение для карт, и я получил экран ниже, предлагая мне включить весь этот джаз, чтобы улучшить свое местоположение.

Как только я это сделал, мое устройство смогло получить местоположение только с одним вызовом getLastLocation() ;

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

введите описание изображения здесь

  • android getlastknownlocation возвращает null
  • Перенаправление с помощью AngularJS
  • Android O - Старая служба переднего плана начала работать?
  • getLastKnownLocation возвращает null
  • Получить направление (компас) с двумя точками долготы / широты
  • Как измерить силу сигнала GPS на Android?
  • RecyclerView - просмотр в определенном положении
  • Как получить текущее местоположение GPS программно в Android?
  • Разрешения на размещение в приложении android Marshmallow
  • Как работать с отложенным местоположением iOS 6?
  • Как проверить, включены ли службы определения местоположения?
  • Давайте будем гением компьютера.