官方文档参考:
https://developer.android.com/training/permissions/requesting
安卓6.0以后,用户可以将授予权限操作延迟到运行应用时,之前必须在安装时授权,否则无法安装应用。
系统权限分为普通权限和危险权限,普通权限会在安装应用时自动授权。危险权限有可能会读取用户隐私数据,因此需要请求用户授予权限。
一、检查权限
如果应用需要使用危险权限,则应在每次使用之前检查是否拥有该权限,因为危险权限随时都可能被用户禁止。
// 检查定位权限
int checkResult = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
if (checkResult == PackageManager.PERMISSION_GRANTED)
{
Log.i("=====", "拥有定位权限");
}
else if (checkResult == PackageManager.PERMISSION_DENIED)
{
Log.i("=====", "无定位权限");
}
二、解释为什么使用该权限
在请求权限之前,如果不向用户说明为什么要使用此权限,那么很可能会被拒绝使用权限。系统提供了一个方法,以提示应用何时可以向用户展示使用权限的目的。
// 判断是否应展示使用权限的目的
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION))
{
Toast.makeText(this, "这是一个导航应用,如果您不开放定位权限,我要如何为你导航?", Toast.LENGTH_LONG).show();
}
注:
如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
如果用户在过去拒绝了权限请求,并在权限请求系统对话框中勾选了“不再提示”,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false。
三、请求权限
调用 requestPermissions() 以请求权限。此方法是异步执行的,当授权结束时,系统会调用 Activity 中的 onRequestPermissionsResult() 方法告知授权结果。
以下是官方示例,请求读取用户联系人的权限:
// 首先,检查是否拥有权限
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED)
{
// 判断是否要向用户解释使用权限的目的
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS))
{
// 以异步方式向用户“显示解释” - 不要阻止此线程等待用户的响应!
// 用户看到解释后,再次尝试请求权限。
} else
{
// 如果不需要解释,则开始请求权限
ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS是一个表示你请求了什么权限的常量
// 该值会在处理授权结果时返回,用来判断什么权限被允许了,什么权限被拒绝了
}
}
四、处理请求权限结果
在您的 Activity 中重写 onRequestPermissionsResult() 方法处理请求权限结果。
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
{
switch (requestCode)
{
case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
{
// 如果请求被取消,则结果数组为空
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
// 许可被授予,耶!执行与联系人相关的任务。
} else
{
// 许可被拒绝,禁用使用此权限的功能。
}
return;
}
// 处理其他权限“case”
}
}
网友评论