Fotonick
@Fotonick
android-er (Навальный отменит налоги фрилансерам)

Почему приложение крашится если дважды включить/выключить GPS?

Это лисенер для GPS, расположен во фрагменте

public LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            showLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
            checkEnabled();
        }

        @Override
        public void onProviderEnabled(String provider) {

            checkEnabled();
            if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), 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;
            }
            showLocation(locationManager.getLastKnownLocation(provider));

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };


Это метод просто для замены текста о статусе GPS

private void checkEnabled() {
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

            userLocalStore = new UserLocalStore(getActivity());
            user = userLocalStore.getLoggedInUser();


            if (user.lastLocation != null) {
                GPSview.setText(user.lastLocation);
            } else {
                GPSview.setText("Получение координат включено. Данные со спутника скоро появятся.");
            }


        } else {
            GPSview.setText("Получение координат отключено");
        }


        //GPSview.setText("Enabled: " + locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER));
    }


Так вот когда GPS отключен и запущено приложение, то при первом включении GPS всё нормально. Но если отключить GPS и снова включить, то приложение крашится при вызове checkEnabled(), а именно на строке
userLocalStore = new UserLocalStore(getActivity());
либо если этот метод закоментить, то на строке
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

что, как я понимаю, намекает на проблему с активити, после повторного вызова экрана включения GPS.
Видимо надо как-то проверить готовность активити перед тем как делать что-то внутри onProviderEnabled ? Как?
  • Вопрос задан
  • 357 просмотров
Решения вопроса 1
Во фрагменте вы можете отловить готовность activity в событии onAttach именно тут активность связывается с фрагментом и после чего вы можете без зазрения совести юзать getActivity. Соответственно вы можете либо биндить свой листер после события onAttach либо в нем, или создать флаг, который будет указывать на готовность активности и проверять его значение при вызове checkEnabled.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Hunt Rangers Москва
от 220 000 до 270 000 ₽
Спецвузавтоматика Ростов-на-Дону
от 100 000 до 250 000 ₽