我得到:java.lang.SecurityException:“ gps”位置提供程序需要ACCESS_FINE_LOCATION权限

时间:2019-11-05 07:35:13

标签: android android-permissions android-securityexception

我正在使用映射到我的应用程序的地图,因此这里有一条奇怪的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 :(得分:0)

使用以下代码更新代码可以解决您的问题

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()

答案 1 :(得分:0)

因此,基于注释的解决方案我忘记放置else语句,即如果授予permission,则执行listener,否则向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);
        }
    }
}