Я получаю: java.lang.SecurityException: провайдеру местоположения "gps" требуется разрешение ACCESS_FINE_LOCATION - PullRequest
1 голос
/ 05 ноября 2019

Я работаю с картой для своего приложения, и поэтому у меня есть странное сообщение error, в котором написано java.lang.SecurityException: "GPS" location provider requires ACCESS_FINE_LOCATION permission. каждый раз, когда я запускаю приложение и вылетает из-за этой ошибки, хотя у меня уже есть проверка прав доступа.

Вот мой код:

public class FragmentHome extends Fragment implements OnMapReadyCallback {

    /*
        Set up's
     */

    private static final String TAG = "FragmentHome";

    /*
        Pallete
     */


    private MapView mapView;
    private GoogleMap gMap;

    private static final String MAP_VIEW_BUNDLE_KEY = "SOME_KEY";

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view_fragmentInflate = inflater.inflate(R.layout.fragment_fragment_home, container, false);

        mapView = (MapView) view_fragmentInflate.findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(this);

        return view_fragmentInflate;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        getUserLocation();
    }

    private void getUserLocation() {
        LocationManager locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);

        LocationListener locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                Log.i(TAG, "onLocationChanged: " + location);
            }

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

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {

            }
        };

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (getContext().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                getContext().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    Activity#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 Activity#requestPermissions for more details.
                requestPermissions(new String[] {
                        Manifest.permission.ACCESS_FINE_LOCATION
                }, 1);
            }
        }

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                3000, 0, locationListener);
    }
}

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

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Таким образом, решение для этого и на основе комментариев я забыл поставить оператор else, что если permission предоставлено, то выполнить listener else request разрешение.

Обновлено:

public class FragmentHome extends Fragment implements OnMapReadyCallback {

    /*
        Set up's
     */

    private static final String TAG = "FragmentHome";

    /*
        Pallete
     */


    private MapView mapView;
    private GoogleMap gMap;

    private static final String MAP_VIEW_BUNDLE_KEY = "AIzaSyDWL-JNHiCXvQefgFh1BdaAflJTveSrHJo";

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view_fragmentInflate = inflater.inflate(R.layout.fragment_fragment_home, container, false);

        mapView = (MapView) view_fragmentInflate.findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(this);

        return view_fragmentInflate;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        checkGPSPermission();
        getUserLocation();
    }

    private void checkGPSPermission() {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if(getContext().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                if(shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {
                    // show why is important
                }

                requestPermissions(new String[] {
                        Manifest.permission.ACCESS_FINE_LOCATION
                }, 1);
            } else {
                // granted
            }
        } else {
            // granted
        }
    }

    private void getUserLocation() {
        LocationManager locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);

        LocationListener locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                Log.i(TAG, "onLocationChanged: " + location);
            }

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

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {

            }
        };

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (getContext().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                getContext().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    Activity#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 Activity#requestPermissions for more details.
                requestPermissions(new String[] {
                        Manifest.permission.ACCESS_FINE_LOCATION
                }, 1);
            } else {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                        3000, 0, locationListener);
            }
        } else {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    3000, 0, locationListener);
        }
    }
}
0 голосов
/ 05 ноября 2019

Обновление кода с помощью приведенного ниже кода может решить вашу проблему

public class FragmentHome extends Fragment implements OnMapReadyCallback {

    /*
        Set up's
     */

        private static final String TAG = "FragmentHome";

    /*
        Pallete
     */


        private MapView mapView;
        private GoogleMap gMap;

        private static final String MAP_VIEW_BUNDLE_KEY = "AIzaSyDWL-JNHiCXvQefgFh1BdaAflJTveSrHJo";

        @SuppressLint("SetJavaScriptEnabled")
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view_fragmentInflate = inflater.inflate(R.layout.fragment_fragment_home, container, false);

            mapView = (MapView) view_fragmentInflate.findViewById(R.id.mapView);
            mapView.onCreate(savedInstanceState);
            mapView.getMapAsync(this);

            return view_fragmentInflate;
        }

        boolean isMapReady;
        @Override
        public void onMapReady(GoogleMap googleMap) {
            isMapReady=true;
            getUserLocation();
        }

        private void getUserLocation() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (ActivityCompat.checkSelfPermission(getContext(),Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                        ActivityCompat.checkSelfPermission(getContext(),Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    Activity#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 Activity#requestPermissions for more details.
                    requestPermissions(new String[]{
                            Manifest.permission.ACCESS_FINE_LOCATION
                    }, 1);
                    return;
                }
            }

            LocationManager locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
            LocationListener locationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    Log.i(TAG, "onLocationChanged: " + location);
                }

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

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {

                }
            };


            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    3000, 0, locationListener);

        }
    }

Теперь переопределите onRequestPermissionsResult() и проверьте, предоставлен ли результат, и установлен ли флаг isMapReady в значение true, затем вызовите getUserLocation().

...