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

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

Похожие вопросы