android 跳转权限管理的代码,Android权限管理

Android权限管理

说明

在targetSdkVersion的值为23或者更高,就要进行权限管理,否则如果运行在Android6.0或以上的设备会没有相应权限而导致崩溃

请求权限后,在onRequestPermissionsResult方法回调,在该方法判断三种状态:允许获取权限、拒绝授予权限、拒绝授予权限且不再询问

权限组

Android将不同的权限分组管理,分为正常权限和危险权限。正常权限是不用申请的。在申请危险权限时,系统会向用户弹出一个申请权限的对话框,描述要获取的权限所在的权限组,而不是具体的要申请的权限。只要获得组内的任一权限,那么默认该权限组的所有权限申请成功,再次申请该组内的其他权限,系统将立刻授予权限,不会再显示申请权限对话框

危险权限共9组24个

权限组

描述

权限

CALENDAR

日历

READ_CALENDAR WRITE_CALENDAR

CAMERA

相机

CAMERA

CONTACTS

短信

READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS

LOCATION

定位

ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION

MICROPHONE

录制音频

RECORD_AUDIO

PHONE

电话

READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS

SENSORS

传感器

BODY_SENSORS

SMS

通讯录

SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS

STORAGE

存储

READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE

使用

使用步骤

在清单文件中加入要使用的权限,如果在清单文件中没有事先声明权限,那么在应用信息/权限中看到指定权限的

先判断当前运行平台是否在Android6.0以上,是的话就检查是否已经获取到相应的危险权限

没有相应的危险权限那么就需要去申请权限

在onRequestPermissionsResult回调中查看结果,如果已经获取到权限,则去进行相应的操作。如果没有获取到权限,则有两种可能:禁止或者是禁止且不再询问。禁止的话,还能再下次使用时再去申请权限。如果是禁止且不再询问,那么想要进行下一步操作只能到应用信息/权限界面去手动开启权限了

检查权限

==如果应用需要危险权限,则每次执行需要这一权限的操作时都必须检查自己是否具有该权限。用户始终可以自由调用此权限,因此,即使应用昨天使用了相机,它不能假设自己今天仍具有该权限。==

要检查是否具有某项权限,请调用 ContextCompat.checkSelfPermission() 方法。例如,以下代码段显示了如何检查 Activity 是否具有在日历中进行写入的权限:

// Assume thisActivity is the current activity

int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,

Manifest.permission.WRITE_CALENDAR);

如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PERMISSION_DENIED,且应用必须明确向用户要求权限。

请求权限

如果应用需要应用清单中列出的危险权限,那么,它必须要求用户授予该权限。Android 提供了多种权限请求方式。调用这些方法将显示一个标准的 Android 对话框,不过,不能对它们进行自定义

解释应用为什么需要权限

在某些情况下,可能需要帮助用户了解应用为什么需要某项权限。例如,如果用户启动一个摄影应用,用户对应用要求使用相机的权限可能不会感到吃惊,但用户可能无法理解为什么此应用想要访问用户的位置或联系人。在请求权限之前,不妨为用户提供一个解释。当然,只是一个解释

为了帮助查找用户可能需要解释的情形,Android 提供了一个实用程序方法,即 shouldShowRequestPermissionRationale()。如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true

注:如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了Don't ask again选项,此方法将返回false。如果设备规范禁止应用具有该权限,此方法也会返回false。

请求需要的权限

如果应用尚无所需的权限,则应用必须调用一个requestPermissions()方法,以请求适当的权限。应用将传递其所需的权限,以及指定用于识别此权限请求的整型请求代码。此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同请求代码传递到requestPermissions()

注:当应用调用requestPermissions()时,系统将向用户显示一个标准对话框。应用无法配置或更改此对话框。如果需要为用户提供任何信息或解释,应在用requestPermissions()之前进行,如解释应用为什么需要权限中所述。

处理权限请求响应

当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的onRequestPermissionsResult()方法,向其传递用户响应。应用必须替换该方法,以了解是否已获得相应权限。回调会将传递的相同请求代码传递给requestPermissions()

系统显示的对话框说明了应用需要访问的权限组;它不会列出具体权限。例如,如果请求READ_CONTACTS权限,系统对话框只显示应用需要访问设备的联系人。用户只需要为每个权限组授予一次权限。如果应用请求该组中的任何其他权限(已在应用清单中列出),系统将自动授予应用这些权限。当请求此权限时,系统会调用的onRequestPermissionsResult()回调方法,并传递PERMISSION_GRANTED,如果用户已通过系统对话框明确同意权限请求,系统将采用相同方式操作。

注:应用仍需要明确请求其需要的每项权限,即使用户已向应用授予该权限组中的其他权限。此外,权限分组在将来的 Android 版本中可能会发生变化。代码不应依赖特定权限属于或不属于相同组这种假设

权限被拒绝且不再询问

这时候如果还坚持使用需要该权限的功能,那么就只能到应用详情界面去手动打开权限了,然后回到代码中再去检查是否已经获得权限

//跳转到应用详情界面

Intent intent = new Intent()

intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS")

intent.setData(Uri.fromParts("package",getPackageName(), null));

startActivity(intent);

关键API

onRequestPermissionsResult

应用请求权限结果的回调,无论是同意或拒绝,都会在这里得到结果

ActivityCompat.shouldShowRequestPermissionRationale

向用户解释为什么需要该权限。如果应用之前已经请求过该权限且用户拒绝,那么将返回true

ContextCompat.checkSelfPermission

用来检查是否具有某种权限,如果应用具有此权限,方法将返回PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回PERMISSION_DENIED,且应用必须明确向用户要求权限

ActivityCompat.requestPermissions

请求权限的方法,传入需要请求的权限和整数请求码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值