Android-трансляция GPS включена для обновления местоположения

Что ж, даже если я много читаю здесь, я не могу понять проблему. Похоже, у меня никогда не включается 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());
                    }
                }
            });
        }
...
}

Итак, вот моя логика:

  1. Проверьте, включен ли GPS
  2. Если он отправлен, отправьте запрос mFusedLocationProviderClient.getLastLocation ()
  3. Получаете результат, но всегда не получаете результата, когда GPS просто включен

Итак, в основном, как предоставить местоположение по умолчанию без жесткого кода?

Вот дополнительная информация о странице API Google:

Метод getLastLocation () возвращает Task, который можно использовать для получения объекта Location с координатами широты и долготы географического местоположения. Объект местоположения может быть нулевым в следующих ситуациях:

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

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

  3. Сервисы Google Play на устройстве перезапущены, и нет активного клиента Fused Location Provider, который запрашивал местоположение после перезапуска сервисов. Чтобы избежать этой ситуации, вы можете создать нового клиента и самостоятельно запросить обновления местоположения. Для получения дополнительной информации см. Получение обновлений местоположения.

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


person Zhar    schedule 13.11.2019    source источник
comment
Вы удостоверились, что приемник телетрансляции принимает событие или нет?   -  person Muhammed Refaat    schedule 16.11.2019
comment
Я получаю событие каждый раз (отключено / подключено), но, к сожалению, проблема, похоже, связана с updateMyLocation, потому что, когда включен GPS, маркер не добавляется на карту, как это решить?   -  person Zhar    schedule 16.11.2019


Ответы (1)


поскольку вы получаете событие, это означает, что оно не имеет ничего общего с самим устройством и похоже, что оно находится в вашем месте обновления, метод в моем случае я использую 'OnSuccessListener', а не 'OnCompleteListener', я не знаю, это будет проблемой или нет, но так или иначе я обновляю местоположение на своей стороне:

/**
 * To get the current MapLocation and add marker at that location
 */
@SuppressLint("MissingPermission")
private void setCurrentLocation() {
    try {
        FusedLocationProviderClient locationClient = new FusedLocationProviderClient(getActivity());
        if (checkLocationPermissions()) {
            Task<Location> currentLocationTask = locationClient.getLastLocation(); // already checked
            currentLocationTask.addOnSuccessListener(new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    try {
                        // Now, add the required Marker
                        addMarker(new LatLng(location.getLatitude(), location.getLongitude()));
                    } catch (NullPointerException npe) {
                        npe.printStackTrace();
                        Toast.makeText(getActivity(), getResources().getString(R.string.cannot_get_location), Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

/**
 * Adding a Marker at the Map
 *
 * @param point the point contains the latitude and longitude to add the marker at
 */
private void addMarker(LatLng point) {
    try {
        marker.remove();
    } catch (NullPointerException ex) {
        ex.printStackTrace();
    }
    MarkerOptions markerOptions = new MarkerOptions().position(
        new LatLng(point.latitude, point.longitude)).title(getAddressAtLocation(point));
    marker = mMap.addMarker(markerOptions);
    currentChosenLocation = point;
}
person Muhammed Refaat    schedule 17.11.2019
comment
к сожалению, это не работает на моем телефоне, я использую для отображения информации о невозможности получить местоположение в методе инструкции else updateMyLocation (), и когда включен gps, FusedLocationProviderClient не возвращает результата в моем случае, почему? - person Zhar; 17.11.2019
comment
любое исключение или что-то особенное, что вы получаете в журналах - person Muhammed Refaat; 18.11.2019
comment
К сожалению, здесь нет ничего особенного, я просто получаю null в task.getResult () при запросе последнего местоположения, поэтому в результате у меня нет маркера для отображения. Круглая точка карты Google отображается на карте, но я все еще не могу добавить на нее маркер, когда включен GPS - person Zhar; 18.11.2019
comment
все еще есть проблема? - person Zhar; 23.11.2019
comment
к сожалению, я пока не могу придумать другое решение, может быть, как только у меня будет шанс, я попробую прийти и посмотреть, сработает ли это на моей стороне или нет - person Muhammed Refaat; 26.11.2019