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

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

首先,有必要阐述一下有关地图涉及的两个层面的权限问题:
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错误没有出现,证明我们打开了允许应用使用网络的应用层面权限后,就是应用可以正常使用网络定位功能了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 系统中,可以使用以下代码检查应用/Channel的“允许发生”权限是否打开: ```java NotificationManagerCompat manager = NotificationManagerCompat.from(context); boolean areNotificationsEnabled = manager.areNotificationsEnabled(); if (areNotificationsEnabled) { // 通知权限已经打开 } else { // 通知权限打开 } ``` 其中,`NotificationManagerCompat` 是 Android Support Library 中提供的一个通知管理器,可以用来检查通知权限。`areNotificationsEnabled` 方法用于检查通知权限是否已经打开。如果返回 `true`,则表示通知权限已经打开;如果返回 `false`,则表示通知权限打开。 需要注意的是,在 Android 8.0 及以上版本中,还需要为每个 Channel 单独检查通知权限。可以使用以下代码检查指定 Channel 的通知权限是否打开: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationManager manager = context.getSystemService(NotificationManager.class); NotificationChannel channel = manager.getNotificationChannel(channelId); boolean isChannelEnabled = channel.getImportance() != NotificationManager.IMPORTANCE_NONE; if (isChannelEnabled) { // Channel 的通知权限已经打开 } else { // Channel 的通知权限打开 } } ``` 其中,`channelId` 是要检查的 Channel 的 ID。`getNotificationChannel` 方法用于获取指定的 Channel 对象,然后可以使用 `getImportance` 方法检查该 Channel 的通知权限是否已经打开。如果 `getImportance` 方法返回值不等于 `NotificationManager.IMPORTANCE_NONE`,则表示该 Channel 的通知权限已经打开;否则,表示该 Channel 的通知权限打开

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值