Android 6.0 getLastKnowLocationPermission

烈酒焚心 提交于 2019-12-11 05:52:28

问题


I have a error when I'm trying to get last known location in Android 6.0

Location lastLocation =locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

Error:

java.lang.SecurityException: "network" location provider requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission.

My manifest:

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>

check permissions:

LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        if (ActivityCompat.checkSelfPermission(context,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            try {
                ActivityCompat.requestPermissions(getActivity(), new String[] {
                                Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.ACCESS_COARSE_LOCATION },
                        1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        PointDTO point = new PointDTO();

        try {
            Location lastLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//            addresses = geocoder.getFromLocation(lat, lon, 1);
//            //        String cityName = addresses.get(0).getAddressLine(0);
//            //        String countryName = addresses.get(0).getAddressLine(2);
//            address= addresses.get(0).getAddressLine(0);
            point.setLat(lastLocation.getLatitude());
            point.setLon(lastLocation.getLongitude());

        } catch (NullPointerException | SecurityException e) {
            e.printStackTrace();
        }

        return point;

What I did wrong? It works in Android Api 23-

UPD:

NPE:

 ActivityCompat.requestPermissions(getActivity(), new String[] {
                            Manifest.permission.ACCESS_FINE_LOCATION,
                            Manifest.permission.ACCESS_COARSE_LOCATION },
                    1);

SecurityException

    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

回答1:


You should do get location work if runtime location permissions are given for marshmallow(android api 23 or above), check this:

This line of code

Location lastLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

here will show you error in code for security exception and ask to use runtime permission code everywhere for code, no need to worry you can execute the build with this error info.

private void checkRuntimePermissions(){
        if (ActivityCompat.checkSelfPermission(context,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            try {
                ActivityCompat.requestPermissions(getActivity(), new String[] {
                                Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.ACCESS_COARSE_LOCATION },
                        1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else{
            getMyLocation();
        }
    }

    private PointDTO getMyLocation(){
        PointDTO point = new PointDTO();
        try {
            LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
            Location lastLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//            addresses = geocoder.getFromLocation(lat, lon, 1);
//            //        String cityName = addresses.get(0).getAddressLine(0);
//            //        String countryName = addresses.get(0).getAddressLine(2);
//            address= addresses.get(0).getAddressLine(0);
            point.setLat(lastLocation.getLatitude());
            point.setLon(lastLocation.getLongitude());

        } catch (NullPointerException | SecurityException e) {
            e.printStackTrace();
        }

        return point;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQ_ACCESS_COARSE_LOCATION:
            case REQ_ACCESS_FINE_LOCATION: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! 
                    checkRuntimePermissions();
                } else {
                    //do other operation because permission not given
                }
                return;
            }
        }
    }



回答2:


I alos had the same problem while doing these.You should access location after granting the permission

it should be inside method onRequestPermissionsResult()

refer request permission blog



来源:https://stackoverflow.com/questions/40783020/android-6-0-getlastknowlocationpermission

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!