Android 动态申请多个权限 EasyPermissions

570 阅读3分钟

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老皮!!!欢迎大家来找我探讨交流👀