判断Android应用是否打开了使用网络权限
2017-02-13 18:35
375 查看
前提:
自己编写的应用中有地图定位的功能,需要使用网络来进行地图上的定位。
首先,有必要阐述一下有关地图涉及的两个层面的权限问题:
1. 手机系统层面的权限,即手机系统本身的无线是否打开,4G是否打开,GPS是否打开(Android手机一般在主界面下滑就能看到,位置明显),定位位置是否打开(这个可以在系统设置-》隐私中查看)。
2. 应用本身层面的权限设置,这个就是需要打开设置-》应用程序-》应用程序权限管理-》你的应用,在这个界面能看到你的应用所具备的权限开关,比如要提到的“使用网络“。也就是说即便是手机系统层面的已经打开了网络,但是你的应用在这个设置界面中“使用网络“的开关是关闭的,那么就会造成报错或者别的问题。
详细分析和解决方案:
今天要说的问题就是上面提到的,手机系统层面的网络、GPS和定位都打开了,应用的使用网络被禁用后,后台出现的这样的错误:
错误提示说,当前的用户或者当前的进程没有ACCESS_COARSE_LOCATION的使用权限。
值得注意的是,这个ACCESS_COARSE_LOCATION权限在AndroidManifest.xml中是配置了的:
所以,我们需要找到一个方法,它的功能仅仅是判断我的应用在应用权限管理的系统页面,是否打开了我需要的权限,也就是说手机系统是否允许我的应用使用系统中的某项功能。
因此,像什么
或者
都会返回true,因为它们都不是检查的应用程序权限管理中应用能否使用某个权限的问题。
应该使用这个:
来判断,可以看到当返回值为“0“的时候, java.lang.SecurityException错误没有出现,证明我们打开了允许应用使用网络的应用层面权限后,就是应用可以正常使用网络定位功能了。
自己编写的应用中有地图定位的功能,需要使用网络来进行地图上的定位。
首先,有必要阐述一下有关地图涉及的两个层面的权限问题:
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错误没有出现,证明我们打开了允许应用使用网络的应用层面权限后,就是应用可以正常使用网络定位功能了。
相关文章推荐
- android4.0 中设置网络出错,Android判断网络是否打开,并打开设置网络界面
- Android判断网络是否打开,并打开设置网络界面
- Android判断网络是否打开,并打开设置网络界面
- iOS 判断应用是否有使用相机的权限
- 关于android 应用中安装另一个应用 打开另一个应用 判断另一个应用是否安装
- android 中获取网络状态、判断3G、2G、wifi网络、判断wifi是否打开、获取本机地址、获取本机串号IMEI整理
- Android 工具类 —— 判断网络连接状态、GPS是否打开、基站信息和手机IMSI码
- Android 判断是否打开移动网络开关
- Android判断网络状态是否断开+Android完全关闭应用程序+ 本文讲述了Android中不同Activity之间的数据传递 — Bundle对象的实现(-)+Android中Bundle的使用示例
- Android 关于判断应用是否有网络
- Android判断网络是否打开,并打开设置网络界面
- Android判断网络是否打开,并打开设置网络界面
- android判断应用是否有某个权限
- android判断应用是否有某个权限
- android判断应用是否有某个权限
- iOS7判断应用的麦克风权限是否打开
- android判断应用是否有某个权限
- 【Android】使用ConnectivityManager与NetworkInfo实现判断当前网络环境是否可用
- Android判断网络是否打开,并打开设置网络界面
- Android判断网络连接是否可用,WiFi、移动数据是否打开等