Что ж, даже если я много читаю здесь, я не могу понять проблему. Похоже, у меня никогда не включается GPS.
После некоторой проверки в отладке флаг isGps верен. Но в результате предупреждение пользователя работает нормально, но не обновляет местоположение. Я просто хочу добавить маркер при включенном gps и вроде тут что-то не правильно синхронизируется.
И это даже с учетом точного определения местоположения.
Я использую этот код из своего фрагмента.
public class MapDialogFragment extends DialogFragment
implements OnMapReadyCallback, GoogleMap.OnMarkerDragListener {
.....
private BroadcastReceiver mGpsSwitchStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (LocationManager.PROVIDERS_CHANGED_ACTION.equals(intent.getAction())) {
boolean isGPS = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if(isGPS){
// never goes here WHEN GPS TURNED ON !!! WHY ?? MAKES ME CRAZY
// + how get current location here ? is updateMyLocation call ok ?
updateMyLocation();
}
else{
// user alert
Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.message_location_error_gps_off), Toast.LENGTH_LONG).show();
}
}
}
};
@Override
public void onResume() {
super.onResume();
getContext().registerReceiver(mGpsSwitchStateReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));
}
@Override
public void onPause() {
super.onPause();
getContext().unregisterReceiver(mGpsSwitchStateReceiver);
}
private void updateMyLocation(){
Task locationResult = mFusedLocationProviderClient.getLastLocation();
locationResult.addOnCompleteListener(getActivity(), new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful() && task.getResult() != null) {
// Set the map's camera position to the current location of the device.
mLastKnownLocation = (Location) task.getResult();
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(mLastKnownLocation.getLatitude(),
mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
latitude = mLastKnownLocation.getLatitude();
longitude = mLastKnownLocation.getLongitude();
// add marker
buildMarkerFromLocation();
} else {
Log.d(TAG, "Current location is null. Using defaults.");
Log.e(TAG, "Exception: %s", task.getException());
}
}
});
}
...
}
Итак, вот моя логика:
- Проверьте, включен ли GPS
- Если он отправлен, отправьте запрос mFusedLocationProviderClient.getLastLocation ()
- Получаете результат, но всегда не получаете результата, когда GPS просто включен
Итак, в основном, как предоставить местоположение по умолчанию без жесткого кода?
Вот дополнительная информация о странице API Google:
Метод getLastLocation () возвращает Task, который можно использовать для получения объекта Location с координатами широты и долготы географического местоположения. Объект местоположения может быть нулевым в следующих ситуациях:
Местоположение отключено в настройках устройства. Результат может быть нулевым, даже если последнее местоположение было ранее получено, потому что отключение местоположения также очищает кеш.
Устройство никогда не записывало свое местоположение, что могло быть в случае нового устройства или устройства, для которого были восстановлены заводские настройки.
Сервисы Google Play на устройстве перезапущены, и нет активного клиента Fused Location Provider, который запрашивал местоположение после перезапуска сервисов. Чтобы избежать этой ситуации, вы можете создать нового клиента и самостоятельно запросить обновления местоположения. Для получения дополнительной информации см. Получение обновлений местоположения.
Надеюсь, я решу это с вашей помощью. Должно быть что-то очевидное, но я не знаю, что не так ...