Android权限检查机制
Android权限检查机制
程序想要执行任何的特定操作,必须先申请权限,申请方法只需要在程序的AndroidManifest.xml中添加相应的权限代码即可。比如,在程序中使用发短信的功能,需添加:
<uses-permission android:name = "android.permission.SEND_SMS" />
所有可以使用的权限分为两大类:直接读写设备的底层权限(low-level)与间接读写设备的高层权限(high-level),举几个例子:
android.permission.INTERNET权限属于底层权限,声明如下:
<permission name = "android.permission.INTERNET" > //name表示权限名称
<group gid = "inet" /> //gid表示所关联的用户组
</permission> //当软件声明了该权限后,运行时的进程所属的用户就会添加到inet用户组
高层权限与底层权限不同,高层权限是通过Framework层的权限检查代码来进行权限控制的。比如权限android.permission.ACCESS_NETWORK_STATE权限:
private boolean CheckNetworkState() {
boolean fiag = false;
ConnectivityManager manager = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE) ;
if(manager.getActiveNetworkInfo() != null) {
flag = manager.getActiveNetworkInfo().isAvailable();
}
return flag;
}
其中,CheckNetworkState()方法用于检查当前网络状态是否可用,调用的ConnectivityManager类的getActiveNetworkInfo()方法就需要使用android.permission.ACCESS_NETWORK_STATE权限。
getActiveNetworkInfo()的实现如下:
public NetworkInfo getActiveNetworkInfo() {
enforceAccessPermission();
final int uid = Binder.getCallingUid();
return getNetworkInfo(mActiveDefaultNetwork , uid);
}
enforceAccessPermission()用于执行权限检查,实现如下:
private void enforceAccessPermission() {
mContext.enforceCallingOrSelfPermission (android.Manifest.permission.ACCESS_NETWORK_STATE , "ConnectivityService");
}
经分析是调用enforceCallingOrSelfPermission()方法来检查,该方法的作用是检查是否声明了访问网络状态的权限android.permission.ACCESS_NETWORK_STATE。
根据检查的内容与处理方法的不同,将权限检查分为以下几类:
(1)检查权限并返回结果型
(2)检查权限失败抛出异常型
(3)Uri权限控制型
(4)Uri权限检查并返回结果型
(5)Uri权限检查失败抛出异常型