美文网首页
安卓动态请求权限

安卓动态请求权限

作者: 安静的程序员 | 来源:发表于2018-09-30 16:02 被阅读0次

官方文档参考:
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”
    }
}

相关文章

网友评论

      本文标题:安卓动态请求权限

      本文链接:https://www.haomeiwen.com/subject/wtvwoftx.html