目录
1) 为什么需要权限呢?
2)EasyPermissions 是什么?
3)权限应该在什么时候提示用户申请呢?
4)具体流程原理。
5)如何使用。
6)使用到的类介绍。
一、为什么需要权限呢?
在Android6.0之后,谷歌对于应用程序权限进行的规范,对于特殊权限必须明确需要让用户授权。如果按照传统的方式,则写法非常复杂。
二、EasyPermissions
这里有一个好用的权限相关的库EasyPermissions。EasyPermissions 是 谷歌官方推荐 的动态权限申请库 ;可以简化我们申请权限的代码。
三、权限应该在什么时候提示用户申请呢?
- 在用户首次打开应用(app的主界面)或特定功能时,检查并请求必需的权限。
- 对已拒绝的权限进行重试或提示,引导用户到系统设置页面授权。
- 自定义权限请求对话框,提高用户体验。
四、具体流程原理
- 首先我们需要定义app所需要的权限。
- 然后让这个框架就会帮助我们验证这些权限,app是否已经授权,如果没有授权,就会提示用户去申请权限。
- 当用户所有权限都开启后,将不会再提示。
五、如何使用
(1)引入依赖
// 使用 Android X 的应用添加该依赖
implementation 'pub.devrel:easypermissions:3.0.0'
(2)比如我们清单文件里面需要申请这些权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
(3)检查是否有对应的权限,如果没有将提示用户授予权限。
/**
* 第一步:填写需要检查是否授权的权限
* *PERMMISSIONS 等同于可变参数
*/
var PERMMISSIONS: Array<String> = arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.INTERNET,
Manifest.permission.READ_CONTACTS)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main3)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
doSomethingWithPermissions()
}
/**
* 第二步:检查是否有对应的权限,如果没有将提示用户授予权限。
* 使用@AfterPermissionGranted(Companion.PERMISSION_REQUEST_CODE)注解来标记该函数需要在获取权限后执行。
*/
@AfterPermissionGranted(Companion.PERMISSION_REQUEST_CODE)
fun doSomethingWithPermissions(){
Log.i(TAG, "doSomethingWithPermissions")
// 调用 EasyPermissions.hasPermissions 方法判定是否已经申请该权限
if(EasyPermissions.hasPermissions(this,
*PERMMISSIONS)){
// 如果有上述权限, 执行该操作
Toast.makeText(this, "权限申请通过", Toast.LENGTH_LONG).show()
}else{
// 如果没有上述权限 , 那么调用requestPermissions申请权限,用户拒绝权限申请后 , 再次申请会自动弹出该对话框 ;
EasyPermissions.requestPermissions(
this,
"权限申请原理对话框 : 描述申请权限的原理",
Companion.PERMISSION_REQUEST_CODE,//权限请求的请求码。
// 数组前加上 * 符号 , 可以将数组展开 , 转为可变数组
*PERMMISSIONS//要请求的权限数组
)
}
}
```go
// 权限结果回调方法
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
// 将返回结果转给EasyPermissions
//使用EasyPermissions.onRequestPermissionsResult()方法将权限请求结果转发给EasyPermissions库进行处理。
//EasyPermissions 收到结果后 , 会回调相关的回调函数(onPermissionsGranted or onPermissionsDenied )
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
(3)在用户授权成功,则会调用如下这个方法
// 授予权限
override fun onPermissionsGranted(requestCode: Int, list: MutableList<String>) {
Toast.makeText(this@MainActivity, "权限授予了", Toast.LENGTH_SHORT).show();
}
(4)用户拒绝授权,则会调用如下这个方法
// 请求权限被拒
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
Toast.makeText(this@MainActivity, "权限拒绝了"+perms, Toast.LENGTH_SHORT).show()
// 弹框提示用户跳转设置打开权限
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
//如果用户在权限申请时 , 选择了 “拒绝 , 不要再询问” , 这是永久拒绝了应用的权限申请
//此时可以调用AppSettingsDialog 对话框 , 该对话框的作用是引导用户前往设置界面 ,
//自行为应用授权 ; 如果用户点击确定后会跳转到 设置 中的 应用信息 界面 ,
//在该界面中 , 用户可以在 权限 选项中 , 手动为应用授权 ;
AppSettingsDialog.Builder(this).build().show()
}
}
比如你点击了取消
如果你点击取消,则会继续在app里面,但有些功能可能会因为没有权限导致无法使用,如果你点击了确定,则会调用到系统里面全设置权限。
六、使用到的类介绍
@AfterPermissionGranted
AfterPermissionGranted 注解的作用是 , 当请求码对应的权限申请全部通过后,再次回调一次该方法 . ( 相当于调用了两次该方法 )。
@AfterPermissionGranted() 注解中使用常量 , 该常量只能使用 const val 定义 ;并且和requestPermissions 的参数三保持一致。
EasyPermissions类的方法
1)hasPermissions方法
检查当前的上下文对象 ( 应用 ) 是否被授权指定的权限集合,如果所有的权限都被授权了返回 true, 如果有一个权限没有被授予就会返回 false 。
if(EasyPermissions.hasPermissions(this,
*PERMMISSIONS)){
// 如果有上述权限, 执行该操作
Toast.makeText(this, "权限申请通过", Toast.LENGTH_LONG).show()
}
2)requestPermissions 方法
申请一组权限, 如果系统要求 ( 用户之前拒绝过 ) , 显示 权限申请原理对话框 , 向用户表明申请该权限的原因 .
1.参数二:解释为什么申请改组权限的原因的信息;这些信息会在用户第一次拒绝权限申请后显示在 权限申请原理对话框 中。用户申请权限 , 如果是首次申请 , 该对话框不弹出 , 如果不是首次申请 , 并且之前拒绝过某些权限申请 , 就会弹出该对话框
2.参数三:追踪本次权限申请的申请码 , 必须小于 256.
3.参数四:要申请的权限数组。
EasyPermissions.requestPermissions(
this,
"权限申请原理对话框 : 描述申请权限的原理",
Companion.PERMISSION_REQUEST_CODE,//权限请求的请求码。
// 数组前加上 * 符号 , 可以将数组展开 , 转为可变数组
*PERMMISSIONS//要请求的权限数组
)
3)onRequestPermissionsResult 方法
调用 EasyPermissions.onRequestPermissionsResult 的结果就是 , 如果用户同意了权限申请 , 就会回调 onPermissionsGranted 方法 , 如果用户拒绝了权限申请 , 就会回调 onPermissionsDenied 方法。
PermissionCallbacks
用于处理申请权限后,拒绝或同意而调用的回调接口。
他有两个函数。onPermissionsGranted和onPermissionsDenied