1、前言:
- Android现在将所有的权限归为了两类,一类是普通权限,一类是危险权限。对于普通权限,系统会自动帮我们进行授权,不需要手动操作。对于危险权限,必须要由用户手动进行点击授权才可以,否则程序无法完成相应的功能。
- Android 6.0系统中加入了运行时权限功能,在使用过程中再对危险权限进行授权。罗列Android中所有的危险权限,一共是9组24个权限。
2、项目依赖
//AndroidX 需要引用
implementation 'pub.devrel:easypermissions:3.0.0'及以上
//其他低版本:
implementation 'pub.devrel:easypermissions:2.0.1
3、申请权限
EasyPermissions.requestPermissions(
this,
"打开存储权限",
ALL_PERMISSION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
)
4、实现EasyPermissions.PermissionCallbacks接口,重写两个方法
class LimitsAuthorityActivity: AppCompatActivity(), EasyPermissions.PermissionCallbacks {
companion object{
//权限code
const val ALL_PERMISSION = 1000
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_limits_authority)
}
/**
* 申请成功时调用
* @param requestCode 请求权限的唯一标识码
* @param perms 一系列权限
*/
override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
Log.d("lyy","----权限授予了-----")
ToastUtils.showToast(this@LimitsAuthorityActivity,"权限被授予了")
}
/**
* 申请拒绝时调用
* @param requestCode 请求权限的唯一标识码
* @param perms 一系列权限
*/
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
Log.d("lyy","----权限拒绝了-----")
ToastUtils.showToast(this@LimitsAuthorityActivity,"权限被拒绝了")
// 弹框提示用户跳转设置打开权限
if (EasyPermissions.somePermissionPermanentlyDenied(this@LimitsAuthorityActivity, perms)) {
//"权限被拒绝,请手动打开权限"
AppSettingsDialog.Builder(this@LimitsAuthorityActivity).setTitle("提示").setRationale("没有此权限,程序无法正常工作,打开设置页面修改权限").setPositiveButton("确定").setNegativeButton("取消").build().show()
}
}
}
5、@AfterPermissionGranted注解
- 使用了该注解,当权限请求被用户同意后,会根据请求code来执行,相应的含有@AfterPermissionGranted注解的方法。
- 简化了请求成功操作流程,不需要在EasyPermissions.onRequestPermissionsResult()的回调监听器中请求成功的方法中,再次手动调用,获取权限后需要操作的逻辑代码。
/**
* 权限申请
*/
@AfterPermissionGranted(ALL_PERMISSION)
private fun openAllPermission() {
if (hasAllPermission()){
openHome()
}else{
// Ask for one permission
EasyPermissions.requestPermissions(
this,
"打开存储权限",
ALL_PERMISSION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
)
}
}
6、LimitsAuthorityActivity页面
package com.lyy.bluetoothdemo
import android.Manifest
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.lyy.bluetoothdemo.tools.ToastUtils
import pub.devrel.easypermissions.AfterPermissionGranted
import pub.devrel.easypermissions.AppSettingsDialog
import pub.devrel.easypermissions.EasyPermissions
/**
* 权限管理
*/
class LimitsAuthorityActivity: AppCompatActivity(), EasyPermissions.PermissionCallbacks {
companion object{
//权限code
const val ALL_PERMISSION = 1000
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_limits_authority)
}
override fun onResume() {
super.onResume()
//申请权限
openAllPermission()
}
/**
* 申请成功时调用
* @param requestCode 请求权限的唯一标识码
* @param perms 一系列权限
*/
override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
Log.d("lyy","----权限授予了-----")
ToastUtils.showToast(this@LimitsAuthorityActivity,"权限被授予了")
openHome()
}
/**
* 申请拒绝时调用
* @param requestCode 请求权限的唯一标识码
* @param perms 一系列权限
*/
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
Log.d("lyy","----权限拒绝了-----")
ToastUtils.showToast(this@LimitsAuthorityActivity,"权限被拒绝了")
// 弹框提示用户跳转设置打开权限
if (EasyPermissions.somePermissionPermanentlyDenied(this@LimitsAuthorityActivity, perms)) {
//"权限被拒绝,请手动打开权限"
AppSettingsDialog.Builder(this@LimitsAuthorityActivity).setTitle("提示").setRationale("没有此权限,程序无法正常工作,打开设置页面修改权限").setPositiveButton("确定").setNegativeButton("取消").build().show()
}
}
/**
* 权限申请
*/
@AfterPermissionGranted(ALL_PERMISSION)
private fun openAllPermission() {
if (hasAllPermission()){
openHome()
}else{
// Ask for one permission
EasyPermissions.requestPermissions(
this,
"打开存储权限",
ALL_PERMISSION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
)
}
}
private fun hasAllPermission(): Boolean {
return EasyPermissions.hasPermissions(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
)
}
fun openHome(){
Log.d("lyy","----进入首页-----")
}
}
👀关注公众号:Android老皮!!!欢迎大家来找我探讨交流👀