Почему FusedLocationApi.getLastLocation равно нулю
Я пытаюсь найти местоположение с помощью FusedLocationApi.getLastLocation
и у меня есть разрешения на местоположение в файле манифеста:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Тем не менее, я получаю null
когда я запрашиваю местоположение из системы. Я только что тестировал выключение и включение служб определения местоположения, так что это может быть связано с этим (конечно, когда я пытаюсь это сделать, он включен). Но даже после возврата нуля я жду onLocationChanged
быть призванным, и это никогда не называется. Я также видел подобный вопрос здесь: FusedLocationApi.getLastLocation всегда null
Вот мой код:
protected LocationRequest createLocationRequest() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(120000);
mLocationRequest.setFastestInterval(30000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
return mLocationRequest;
}
protected GoogleApiClient getLocationApiClient(){
return new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
LocationRequest locationRequest = createLocationRequest();
@Override
public void onLocationChanged(Location location) {
App.setLocation(location); // NEVER CALLED
}
@Override
public void onConnected(Bundle bundle) {
App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient)); //RETURNS NULL
LocationRequest locationRequest = createLocationRequest();
LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient, locationRequest, this);
}
И на onCreate
моего приложения:
locationApiClient = getLocationApiClient();
locationApiClient.connect();
куда this
мой объект приложения. Почему я получаю нулевое значение (да, я знаю, что оно может быть нулевым в некоторых редких случаях, как указано в документах, но я ВСЕГДА получаю это, не редко) и все еще не получаю обновления местоположения после этого? Это реальное устройство (Samsung Galaxy S3) без SIM-карты, если это поможет.
13 ответов
Поставщик объединенного местоположения будет поддерживать фоновое местоположение, только если к нему подключен хотя бы один клиент. Теперь только включение службы определения местоположения не гарантирует сохранение последнего известного местоположения.
Как только первый клиент подключится, он сразу попытается найти местоположение. Если ваша деятельность является первым клиентом, который подключился, и getLastLocation() вызывается сразу в onConnected(), может не хватить времени для прибытия первого местоположения.
Тогда вы устанавливаете mLocationRequest.setFastestInterval(30000);
что в основном означает 30 секунд. так, по крайней мере, 30 секунд после и, как правило, в соответствии с вашими настройками предпочтительное время составляет 120 секунд, не слишком ли много времени, если вообще не сохранено последнее известное местоположение? Кроме того, вы устанавливаете приоритет баланса батареи, что заставляет вас ждать дольше.
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
Я предлагаю вам сначала запустить приложение "Карты", чтобы было хоть какое-то подтвержденное местоположение, а затем протестировать приложение.
Я использую API-интерфейс FusedLocationProvider в своем приложении. Вот мой код, который работает как на устройстве, так и на эмуляторе.
@Override
protected void onCreate(Bundle savedInstanceState){
//put your code here
....
getLocation();
}
private void getLocation(){
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(LOCATION_INTERVAL);
locationRequest.setFastestInterval(LOCATION_INTERVAL);
fusedLocationProviderApi = LocationServices.FusedLocationApi;
googleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
if (googleApiClient != null) {
googleApiClient.connect();
}
}
@Override
public void onConnected(Bundle arg0) {
fusedLocationProviderApi.requestLocationUpdates(googleApiClient, locationRequest, this);
}
@Override
public void onLocationChanged(Location location) {
Toast.makeText(mContext, "location :"+location.getLatitude()+" , "+location.getLongitude(), Toast.LENGTH_SHORT).show();
}
это мой рабочий код.
Надеюсь, мой код поможет вам.
Ура..
Если он возвращает значение NULL, это означает, что вам необходимо начать получать обновления местоположения с помощью LocationServices.FusedLocationApi.requestLocationUpdates, прежде чем извлекать местоположение.
Для меня решением проблемы было назвать:
LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient,locationRequest, this);
перед:
App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient));
Проблема в том, что последнее местоположение не существует, поэтому оно было нулевым.
Если проблема сохраняется, попробуйте это:
Проверьте необходимые разрешения.
Убедитесь, что вы включили положение на вашем устройстве, а затем перезапустите.
Я использовал FusedAPI, и код ниже работает для меня... Тест в реальном устройстве
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Looper;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.PermissionChecker;
import android.widget.ProgressBar;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResolvableApiException;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResponse;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import com.google.android.gms.location.SettingsClient;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnCanceledListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import java.util.ArrayList;
import java.util.LinkedHashMap;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, ResultCallback<LocationSettingsResult> {
private static final int REQUEST_CHECK_SETTINGS = 214;
private static final int REQUEST_ENABLE_GPS = 516;
private final int REQUEST_LOCATION_PERMISSION = 214;
protected GoogleApiClient mGoogleApiClient;
protected LocationSettingsRequest mLocationSettingsRequest;
/* For Google Fused API */
private FusedLocationProviderClient mFusedLocationClient;
private SettingsClient mSettingsClient;
private LocationCallback mLocationCallback;
private LocationRequest mLocationRequest;
private Location mCurrentLocation;
/* For Google Fused API */
private Context context;
private ProgressBar progressBar;
private AsyncTask task;
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
try {
int permissionCheck = PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Helper.showLog("Permission is already allowed. Build Client");
buildGoogleApiClient();
} else {
Helper.showLog("Permission is requested");
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
protected synchronized void buildGoogleApiClient() {
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mSettingsClient = LocationServices.getSettingsClient(this);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
connectGoogleClient();
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
Helper.showLog("Location Received");
mCurrentLocation = locationResult.getLastLocation();
onLocationChanged(mCurrentLocation);
}
};
}
private void connectGoogleClient() {
GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();
int resultCode = googleAPI.isGooglePlayServicesAvailable(this);
if (resultCode == ConnectionResult.SUCCESS) {
mGoogleApiClient.connect();
} else {
int REQUEST_GOOGLE_PLAY_SERVICE = 988;
googleAPI.getErrorDialog(this, resultCode, REQUEST_GOOGLE_PLAY_SERVICE);
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(30 * 1000);
mLocationRequest.setFastestInterval(5 * 1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
builder.setAlwaysShow(true);
mLocationSettingsRequest = builder.build();
mSettingsClient
.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Helper.showLog("GPS Success");
requestLocationUpdate();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(MapsActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sie) {
Helper.showLog("PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Helper.showLog("Location settings are inadequate, and cannot be fixed here. Fix in Settings.");
}
}
}).addOnCanceledListener(new OnCanceledListener() {
@Override
public void onCanceled() {
Helper.showLog("checkLocationSettings -> onCanceled");
}
});
}
@Override
public void onConnectionSuspended(int i) {
connectGoogleClient();
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
buildGoogleApiClient();
}
@Override
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
}
@Override
public void onLocationChanged(Location location) {
String latitude = String.valueOf(location.getLatitude());
String longitude = String.valueOf(location.getLongitude());
if (latitude.equalsIgnoreCase("0.0") && longitude.equalsIgnoreCase("0.0")) {
requestLocationUpdate();
} else {
//Perform Your Task with LatLong
}
}
@SuppressLint("MissingPermission")
private void requestLocationUpdate() {
mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CHECK_SETTINGS) {
switch (resultCode) {
case Activity.RESULT_OK:
Helper.showLog("User allow to access location. Request Location Update");
requestLocationUpdate();
break;
case Activity.RESULT_CANCELED:
Helper.showLog("User denied to access location.");
openGpsEnableSetting();
break;
}
} else if (requestCode == REQUEST_ENABLE_GPS) {
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!isGpsEnabled) {
openGpsEnableSetting();
} else {
requestLocationUpdate();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_LOCATION_PERMISSION) {
int permissionCheck = PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Helper.showLog("User Allowed Permission Build Google Client");
buildGoogleApiClient();
} else {
Helper.showLog("User Denied Permission");
}
}
}
private void openGpsEnableSetting() {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent, REQUEST_ENABLE_GPS);
}
@Override
protected void onDestroy() {
//Remove location update callback here
mFusedLocationClient.removeLocationUpdates(mLocationCallback);
super.onDestroy();
}
}
Хелпер Класс
public class Helper {
public static void showLog(String message) {
Log.e("Ketan", "" + message);
}
public static void showToast(Context context, String message) {
Toast.makeText(context, "" + message, Toast.LENGTH_SHORT).show();
}
}
Возможно, ваша проблема в том, что вы подключаете клиент, я не могу сейчас его протестировать, но, как показывает Google Doc в этом примере, вы должны подключить клиент в своем onStart()
метод в деятельности.
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
Для меня это делает работу getLocation
Это точное решение. Но я хотел добавить несколько небольших пояснений, чтобы каждый мог получить точные понятия. Почему это возвращает ноль, я согласен следовать Amit K ответ. Но, чтобы гарантировать исключение NullPointerException, вы начинаете обработку, связанную с местоположением, внутри обратного вызова onLocationChanged().
1) onCreate () компонента Android (например, активность, фрагмент или служба. Примечание: не IntentService), создайте, а затем подключите GoogleApiClient, как показано ниже.
buildGoogleApiClient();
mGoogleApiClient.connect();
где реализация buildGoogleApiClient()
protected synchronized void buildGoogleApiClient() {
Log.i(TAG, "Building GoogleApiClient");
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
Позже в onDestroy() вы можете отключить GoogleApiClient как,
@Override
public void onDestroy() {
Log.i(TAG, "Service destroyed!");
mGoogleApiClient.disconnect();
super.onDestroy();
}
Шаг 1 гарантирует, что вы создадите и подключите GoogleApiClient.
1) Экземпляр GoogleApiClient впервые подключается по методу onConnected(). Теперь ваш следующий шаг должен выглядеть методом onConnected().
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.i(TAG, "GoogleApiClient connected!");
buildLocationSettingsRequest();
createLocationRequest();
location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
Log.i(TAG, " Location: " + location); //may return **null** because, I can't guarantee location has been changed immmediately
}
Выше вы вызвали метод createLocationRequest() для создания запроса местоположения. Метод createLocationRequest() выглядит следующим образом.
protected void createLocationRequest() {
//remove location updates so that it resets
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); //Import should not be **android.Location.LocationListener**
//import should be **import com.google.android.gms.location.LocationListener**;
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
//restart location updates with the new interval
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
3) Теперь при вызове onLocationChange() интерфейса LocationListener вы получаете новое местоположение.
@Override
public void onLocationChanged(Location location) {
Log.i(TAG, "Location Changed!");
Log.i(TAG, " Location: " + location); //I guarantee of change of location here.
}
Вы получите такой результат в Logcat: 03-22 18: 34: 17.336 817-817 / com.LiveEarthquakesAlerts I / LocationTracker: Location: Location [fused 37.421998, -122.084000 acc = 20 et = + 15m35s840ms alt = 0.0]
Примечание. Местоположение, указанное выше, является местоположением штаб-квартиры Google, хотя я нахожусь в Арканзасе. Это происходит, когда вы используете эмулятор. На реальном устройстве показывает правильный адрес.
Чтобы выполнить эти три шага, вы должны настроить свой build.gradle, как показано ниже:
compile 'com.google.android.gms:play-services-location:10.2.1'
С андроидом APILEVEL
выше 23 вам нужны разрешения на время выполнения. Служба определения местоположения ACCESS_COARSE_LOCATION
, ACCESS_FINE_LOCATION
Также нужны разрешения.
Ознакомьтесь с этой документацией https://developer.android.com/training/permissions/requesting.html
Я нашел решение.
Я тестировал свое приложение на телефоне с API 22, и оно работало нормально, однако на API 17 местоположение возвращалось null
,
Оказывается, вы должны разрешить своему телефону использовать службы определения местоположения Google. Вы можете сделать это, перейдя в Settings->Location Access->Check the "WLAN & mobile network location"
(это может называться по-другому в другом API). Его описание таково:
Разрешите приложениям использовать службу определения местоположения Google, чтобы быстрее определять ваше местоположение. Анонимные данные о местоположении будут собраны и отправлены в Google.
Включив его, я неожиданно начал получать столь необходимые данные о месте слияния.
Надеюсь это поможет!
Я не думаю, что это проблема кодирования.
Похоже, что у провайдера определения местоположения устройства есть трудности с точным определением местоположения в предлагаемое время, и метод locationChanged() никогда не вызывается.
Проверьте, не выбрана ли конфигурация устройства для служб определения местоположения в более жестком режиме определения местоположения (например, только GPS).
Если это так, ваш код не может определить ваше местоположение по GPS, если вы находитесь в помещении (как я полагаю, вы). Выберите опцию Высокая точность, и ваши проблемы будут решены.
Я столкнулся с той же проблемой. В моем случае проблема была в разрешении доступа для приложения. Я отказал в разрешении FINE LOCATION, которое было задано при первом запуске приложения.
Попробуйте удалить приложение с вашего устройства и затем повторно развернуть его. Он снова попросит разрешения. Разрешить точный доступ к местоположению.
Работал в моем случае!!
Попробуй это,
private static int UPDATE_INTERVAL = 10000; // 10 sec
private static int FATEST_INTERVAL = 5000; // 5 sec
private static int DISPLACEMENT = 10; // 10 meters
private void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
}
@Override
public void onConnected(@Nullable Bundle bundle) {
mLastLocation = LocationServices.FusedLocationApi
.getLastLocation(mGoogleApiClient);
if(mLastLocation == null){
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
}
Проверьте на своем устройстве, включено ли у вас местоположение или нет.
Вы можете включить его из панели уведомлений или из настроек как:
Настройки -> Личные -> Местоположение
Я использовал только разрешение, которое:
ACCESS_FINE_LOCATION
Мой рабочий код:
package com.go.findlocation;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener {
private GoogleApiClient mGoogleApiClient = null;
//private Location mLocation = null;
private LocationManager mLocationManager = null;
private LocationRequest mLocationRequest = null;
private TextView tv1 = null;
private TextView tv2 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLocationRequest = new LocationRequest();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(7000);
mLocationRequest.setSmallestDisplacement(1);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
tv1 = (TextView) findViewById(R.id.tv1);
tv2 = (TextView) findViewById(R.id.tv2);
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.d("abc", "def");
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Log.d("ghi", "jkl");
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
Log.d("connected", String.valueOf(mGoogleApiClient.isConnected()));
/* if (mLocation != null) {
tv1.setText(String.valueOf(mLocation.getLatitude()));
tv2.setText(String.valueOf(mLocation.getLongitude()));
} else
Toast.makeText(this, "mLocation is null", Toast.LENGTH_SHORT).show();*/
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
if (mGoogleApiClient.isConnected())
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
public void onLocationChanged(Location location) {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Log.d("mno",String.valueOf(mGoogleApiClient.isConnected()));
if (location != null)
{
tv1.setText(String.valueOf(location.getLatitude()));
tv2.setText(String.valueOf(location.getLongitude()));
Toast.makeText(this, location.getLatitude()+" "+location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else
Toast.makeText(this, "location is null", Toast.LENGTH_SHORT).show();
}
}
Столкнулся с подобной проблемой 30 минут назад, код был запущен перед новым симулятором. После изменения ширины симулятора он снова начал работать
Я только что сделал открытие, может быть, это поможет некоторым из вас. Я получал null от getLastLocation(), и оказалось, что это произошло потому, что я пытался получить местоположение только с включенным GPS, но, видимо, вам также необходимо включить Wi-Fi (даже если он не подключен к какой-либо сети). Мне интересно, виноват ли это мой прибор (планшет Samsung)... Я больше копаюсь в теме, но пока ничего не нашел. Буду признателен всем, кто поделится более подробной информацией по этой проблеме.