1、一个Android应用可能需要权限才能调用android系统的功能
2、一个android应用也可能被其它应用调用,因此也需要声明调用自身所需要的权限
声明运行该运用所需要的权限
通过为<manifest.../>元素添加<uses-permission.../>子元素即可为程序本身声明权限
<!----声明该应用本身需要打电话的权限>
<uses-permission android:name = "android.permission.CALL_PHONE"/>
声明调用该应用所需的权限
通过为应用的各组件元素,如<activity.../>元素添加<uses-permission.../>子元素即可声明调用该程序所需的权限
<!-----uses-permission android:name="android.permission.SEND_SMS"/>
Android提供了大量的权限,都位于Manifest.permission类中
Android接口调用控制,首先是root用户和system用户拥有所有的接口调用权限,然后对于其它用户使用Context以下这几个函数来实现
Context.checkCallingOrSelfPermission(String);
Context.checkCallingOrSelfUriPermission(Uri,int);
Context.checkCallingPermission(Permission);
Context.checkCallingUriPermission(Uri,int);
Context.checkPermission(String,int,int);
Context.checkUriPermission(Uri,int,int,int);
Context.checkUriPermission(Uri,String,String,int,int,int);
Context.enforceCallingOrSelfPermission(String,String);
Context.enforceCallingOrSelfUriPermission(Uri,int,String);
Context.enforceCallingPermission(String,String);
Context.enforceCallingUriPermission(String,String);
Context.enforcePermission(String,int,int,String);
Context.enforceUriPermission(Uri,int,int,int,String);
Context.enforceUriPermission(Uri,String,String,int,int,int,String);
Context.checkCallingOrSelfUriPermission(Uri,int);
Context.checkCallingPermission(Permission);
Context.checkCallingUriPermission(Uri,int);
Context.checkPermission(String,int,int);
Context.checkUriPermission(Uri,int,int,int);
Context.checkUriPermission(Uri,String,String,int,int,int);
Context.enforceCallingOrSelfPermission(String,String);
Context.enforceCallingOrSelfUriPermission(Uri,int,String);
Context.enforceCallingPermission(String,String);
Context.enforceCallingUriPermission(String,String);
Context.enforcePermission(String,int,int,String);
Context.enforceUriPermission(Uri,int,int,int,String);
Context.enforceUriPermission(Uri,String,String,int,int,int,String);
其中check开头的,只做检查。enforce开头的,不单检查,没有权限的还会抛出异常。
这几个函数最后会调用到PKMS的checkUidPermission,该函数通过对比应用权限信息来判断该应用是否获得权限。