判断Android应用是否打开了使用网络权限

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xinluqishi123/article/details/55051508

前提:
自己编写的应用中有地图定位的功能,需要使用网络来进行地图上的定位。

首先,有必要阐述一下有关地图涉及的两个层面的权限问题:
1. 手机系统层面的权限,即手机系统本身的无线是否打开,4G是否打开,GPS是否打开(Android手机一般在主界面下滑就能看到,位置明显),定位位置是否打开(这个可以在系统设置-》隐私中查看)。
2. 应用本身层面的权限设置,这个就是需要打开设置-》应用程序-》应用程序权限管理-》你的应用,在这个界面能看到你的应用所具备的权限开关,比如要提到的“使用网络“。也就是说即便是手机系统层面的已经打开了网络,但是你的应用在这个设置界面中“使用网络“的开关是关闭的,那么就会造成报错或者别的问题。

详细分析和解决方案:
今天要说的问题就是上面提到的,手机系统层面的网络、GPS和定位都打开了,应用的使用网络被禁用后,后台出现的这样的错误:

W/System.err: java.lang.SecurityException: Neither user 10252 nor current process has android.permission.ACCESS_COARSE_LOCATION.
W/System.err:     at android.os.Parcel.readException(Parcel.java:1546)
W/System.err:     at android.os.Parcel.readException(Parcel.java:1499)
W/System.err:     at com.android.internal.telephony.ITelephony$Stub$Proxy.getAllCellInfo(ITelephony.java:3627)
W/System.err:     at android.telephony.TelephonyManager.getAllCellInfo(TelephonyManager.java:3031)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
W/System.err:     at com.loc.d.a(Reflect.java)
W/System.err:     at com.loc.d.a(Reflect.java)
W/System.err:     at com.loc.bw.a(CgiManager.java)
W/System.err:     at com.loc.bw.b(CgiManager.java)
W/System.err:     at com.loc.bw.a(CgiManager.java)
W/System.err:     at com.loc.bp.w(APS.java)
W/System.err:     at com.loc.bp.e(APS.java)
W/System.err:     at com.loc.a.a(AMapLocationManager.java)
W/System.err:     at com.loc.a.l(AMapLocationManager.java)
W/System.err:     at com.loc.a.g(AMapLocationManager.java)
W/System.err:     at com.loc.a$a.handleMessage(AMapLocationManager.java)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err:     at android.os.Looper.loop(Looper.java:145)
W/System.err:     at android.os.HandlerThread.run(HandlerThread.java:61)

错误提示说,当前的用户或者当前的进程没有ACCESS_COARSE_LOCATION的使用权限。

值得注意的是,这个ACCESS_COARSE_LOCATION权限在AndroidManifest.xml中是配置了的:

<!-- 允许程序访问CellID或WiFi热点来获取粗略的位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

所以,我们需要找到一个方法,它的功能仅仅是判断我的应用在应用权限管理的系统页面,是否打开了我需要的权限,也就是说手机系统是否允许我的应用使用系统中的某项功能。

因此,像什么

LocationManager locationManager = (LocationManager) mBaseApplication.getBaseContext().getSystemService(LOCATION_SERVICE);

或者

PackageManager pm = getPackageManager();  
boolean permission = (PackageManager.PERMISSION_GRANTED ==  pm.checkPermission("android.permission.ACCESS_COARSE_LOCATION",  "myPackage")); 

都会返回true,因为它们都不是检查的应用程序权限管理中应用能否使用某个权限的问题。

应该使用这个:

public boolean checkNetWorkForLocation() {

    /**
         *  判断应用权限管理中该应用是否打开了允许使用网络的权限
         *  -1: 没有打开  0: 已经打开
         */
        int permission = ActivityCompat.checkSelfPermission(getApplicationContext(), "android.permission.ACCESS_COARSE_LOCATION");
        LogMe.d("App's network using permission is " + String.valueOf(permission));

        if(permission == 0) {
            return true;
        } else {
            DialogUtil.showAlertOkCancel(this, getString(R.string.gps_network_permission), new CommonCallback<Boolean>() {
                @Override
                public void onCallBack(Boolean data) {
                    if (data) {
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);
                        startActivity(intent);
                    }
                }
            });
            return false;
        }
    }

来判断,可以看到当返回值为“0“的时候, java.lang.SecurityException错误没有出现,证明我们打开了允许应用使用网络的应用层面权限后,就是应用可以正常使用网络定位功能了。

展开阅读全文

没有更多推荐了,返回首页