一、Android上声明和请求运行时权限的工作流程
- 在应用程序的manifest文件中声明该权限
- 将你的应用UX设计成不言自明的
- 等待用户请求一个特定的操作
- 许可已经授予你的应用程序
(1)Yes : 访问受权限保护的信息
(2)No : 显示原理给用户吗
No:显示原理给用户吗
- Yes : 向用户解释为什么你的应用需要这个权限 – > 请求允许显示系统对话框
- No : 请求允许显示系统对话框
- 是否授予您的应用程序权限?
Yes : 访问受权限保护的信息
No : 优雅降级你的应用程序的经验
二、确定您的应用是否已被授予权限
To check if the user has already granted your app a particular permission, pass that permission into the ContextCompat.checkSelfPermission() method. This method returns either PERMISSION_GRANTED or PERMISSION_DENIED, depending on whether your app has the permission.
要检查用户是否已向您的应用授予特定权限,请将该权限传递给 ContextCompat.checkSelfPermission()
方法。此方法返回 PERMISSION_GRANTED
或PERMISSION_DENIED
,具体取决于您的应用是否具有权限。
所以,
ContextCompat类
的checkSelfPermission方法
用于检测用户是否授权了某个权限。
checkSelfPermission()方法需要传递两个参数:
- 第一个参数需要传入Context
- 第二个参数需要传入需要检测的权限
实例:
public static boolean getPermissionOfcallPhone(Activity activity){
if (ContextCompat.checkSelfPermission(activity,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED){
/** 存在这个权限 */
return true;
}
/** 不存在这个权限 */
return false;
}
方法返回值:
PackageManager.PERMISSION_DENIED
: -1
PackageManager.PERMISSION_GRANTED
: 0
表示授权成功
返回:PackageManager.PERMISSION_GRANTED 表示授权成功
需要查询权限标识:可以点 Manifest.permission
进入类当中查找
需要注意的是在AS里面选中Manifest然后点Alt+Enter,会出现两个提示,一个是引入Manifest(java.util.jar),另一个是引入Manifest(android),
这里需要import的是Manifest(android)的包
,不然会报错:cannot resolve ‘permission’
事例 :
三、说明您的应用为何需要许可
If the ContextCompat.checkSelfPermission() method returns PERMISSION_DENIED, call shouldShowRequestPermissionRationale(). If this method returns true, show an educational UI to the user. In this UI, describe why the feature, which the user wants to enable, needs a particular permission.
如果该ContextCompat.checkSelfPermission()
方法返回PERMISSION_DENIED
,则调用shouldShowRequestPermissionRationale()
。如果此方法返回true
,则向用户显示教育性UI。在此UI中,描述为什么用户要启用的功能需要特定的权限。