normal
,最经常使用的级别,只要在AndroidManifest.xml
中申请,系统会自动受权dangerous
,系统对这个级别的权限处理方式跟系统的Api版本和app的targetSDKVersion
的值有关,当系统的Api版本低于23或者targetSDKVersion
低于23,那么会自动授予权限,不然在Android6.0之后,每次使用dangerous
权限时,都须要检查signature
,当申请权限的app和定义权限的app使用的是相同的签名时,系统自动受权,不然权限申请失败.一般在同一个公司有多个app,且一个app须要调用另外一个的某个组件(例如ContentProvider),且不但愿被外部app调用时,能够定义这种类型的权限.signatureOrSystem
,和signature
相似,只是系统应用也能得到受权(不多用)app B
申请app A
定义的权限P
,可是用户先安装的B
,后安装的A
,那么B
是没法得到权限P
的,所以使用的时候会crash.解决方案是B
也定义一个一样名字的权限便可(只须要定义权限的名字,label,description,protectionLevel等都不须要定义)
app B
没有定义权限P
,那么在Android 6.0如下的系统中,仍然不能得到权限P
,因此解决方法和上面同样,也是在app B
中定义权限P
例如 app A 中定义权限: <permission android:name="com.yyter.systempermission.DangerousActivityPermissionTest" android:label="@string/dangerous_activity_permission_label" android:description="@string/dangerous_activity_permission_desc" android:protectionLevel="dangerous"/> app B 中也作相似的定义: <permission android:name="com.yyter.systempermission.DangerousActivityPermissionTest"/>
app B
和app A
谁先安装,app B
都能得到"com.yyter.systempermission.DangerousActivityPermissionTest"权限,而且可以启动app A
中的DangerousActivityPermissionTest Activity.app A
,那么当app B
申请权限时,将会弹出受权框,由于它在申请app A
定义的权限app B
,那么当app B
申请权限时,将直接得到受权,不会弹框,由于它申请的是本身定义的权限,也就是说这种状况下,app A
中的DangerousActivityPermissionTest Activity其实是由app B
所定义的权限P
来保护的.因此若是再安装一个app C
,那么在安装界面看到的其实是app B
中的权限P
的描述,以及app B
的logo例如 <permission android:name="${your_package_name} + xxxxx" android:protectionLevel="signature"/>
这样定义权限以后,能够经过sendBroadcast(Intent intent,String receiverPermission)
来过滤广播接收者,使得只有本身app自己以及使用相同签名的app才能够收到广播,经常使用于push SDK.java
String permissionName = "XXX";//要检测的权限名称 /** * 此处使用的是ContextCompat,固然也可使用PackageManager或者Context中的对应方法 */ int res = ContextCompat.checkSelfPermission(context, permissionName); if(res == PackageManager.PERMISSION_GRANTED) { //得到了权限 } else if(res == PackageManager.PERMISSION_DENIED) { //未得到权限 }
if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { callPhone(); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, xxx); }
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == xxx) { if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { xxxxx; } else { Toast.makeText(this, "oops!", Toast.LENGTH_LONG).show(); } } }