Android|EasyPermission动态权限框架的使用方法

本文介绍如何使用EasyPermissions库实现Android应用中的权限管理。包括添加依赖、实现权限回调接口、声明所需权限、请求权限及处理结果等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现效果

在这里插入图片描述

准备工作第一步 添加依赖

根据自己使用的APP的框架选用不同的包引入:

dependencies {
    // For developers using AndroidX in their applications
    implementation 'pub.devrel:easypermissions:3.0.0'
 
    // For developers using the Android Support Library
    implementation 'pub.devrel:easypermissions:2.0.1'
}

准备工作第二步 引用接口

在需要权限页面的Activityimplements框架接口:

public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks,
        EasyPermissions.RationaleCallbacks

准备工作第三步 重写方法

在需要权限页面的Activity里重写接口方法:

    /**
     * 重写方法将权限请求结果传递给EasyPermission
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // 回调结果传递给EasyPermission
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

准备工作第四步 声明权限

AndroidManifest.xml文件中声明所需要的动态权限:

//相机权限
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>

以下列出需要进行动态申请的所有权限(危险权限):

权限组名权限名权限用途
android.permission-group.CALENDARandroid.permission.READ_CALENDAR
android.permission.WRITE_CALENDAR
允许程序读取用户日历数据
允许一个程序写入但不读取用户日历数据
android.permission-group.CAMERAandroid.permission.CAMERA允许访问摄像头进行拍照
android.permission-group.CONTACTSandroid.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.GET_ACCOUNTS
允许程序读取用户联系人数据
允许程序写入但不读取用户联系人数据
访问一个帐户列表在Accounts Service中
android.permission-group.LOCATIONandroid.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
允许一个程序访问精良位置(如GPS)
允许一个程序访问CellID或WiFi热点来获取粗略的位置
android.permission-group.MICROPHONEandroid.permission.RECORD_AUDIO允许程序录制音频
android.permission-group.PHONEandroid.permission.READ_PHONE_STATE
android.permission.CALL_PHONE
android.permission.READ_CALL_LOG
android.permission.WRITE_CALL_LOG
android.permission.ADD_VOICEMAIL
android.permission.USE_SIP
android.permission.PROCESS_OUTGOING_CALLS
访问电话状态
允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认
查看电话日志
写入电话日志
允许应用程序添加系统中的语音邮件
允许程序使用SIP视频服务
允许应用程序监视、修改、忽略拨出的电话
android.permission-group.SENSORSandroid.permission.BODY_SENSORS允许该应用存取监测您身体状况的传感器所收集的数据,例如您的心率
android.permission-group.SMSandroid.permission.SEND_SMS
android.permission.RECEIVE_SMS
android.permission.READ_SMS
android.permission.RECEIVE_WAP_PUSH
android.permission.RECEIVE_MMS
允许程序发送SMS短信
允许程序监控一个将收到短信息,记录或处理
允许程序读取短信息
允许程序监控将收到WAP PUSH信息
允许一个程序监控将收到MMS彩信,记录或处理
android.permission-group.STORAGEandroid.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
访问您设备上的照片、媒体内容和文件
允许程序写入外部存储,如SD卡上写文件

实现方法

首先需要定义两个全局变量:

private static final int PERMISSION_CAMERA = 1000; //权限的请求码唯一即可
    String[] perms = {Manifest.permission.CAMERA}; //一些权限用逗号隔开

经过以上,准备工作已完成,实现功能的方法直接在需要的地方调用:

    /**
     * 权限请求方法可直接调用
     */
    @AfterPermissionGranted(PERMISSION_CAMERA)
    public void doSomethingWithCamera() {

        if (EasyPermissions.hasPermissions(this, perms)) {

            //当前有权限时进行的操作
            //...

        } else {
            //没有权限去申请权限
            EasyPermissions.requestPermissions(
                    this, "该权限仅是实现拍摄音视频,请通过权限否则不能使用某些功能!", PERMISSION_CAMERA, perms);
        }
    }

代码注释写的已经很清楚了就不赘述了,以下是剩余接口方法:

    /**
     * 允许权限后触发
     */
    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
        Toast.makeText(this, "应用获得相机权限成功", Toast.LENGTH_LONG).show();
    }

    /**
     * 禁止权限后触发
     */
    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            //在权限弹窗中,用户勾选了'不在提示'且拒绝权限的情况触发
            new AppSettingsDialog.Builder(this).build().show(); //调用接口进入该应用的设置页面
        }
    }

    /**
     * 系统设置回调
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
            Toast.makeText(this, "相机权限为" + EasyPermissions.hasPermissions(this,
                    perms), Toast.LENGTH_LONG).show();
        }
    }

    /**
     * 由于各个厂商对Rationale的实现机制略有不同,考虑通用性,不建议实现以下该接口的两个方法
     */
    @Override
    public void onRationaleAccepted(int requestCode) {

    }

    @Override
    public void onRationaleDenied(int requestCode) {

    }

所有代码

package com.example.easypermission;

import androidx.appcompat.app.AppCompatActivity;
import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.AppSettingsDialog;
import pub.devrel.easypermissions.EasyPermissions;
import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

import java.util.List;

/**
 *
 * @author 纸鱼
 * @since 2022-11-05 22:40
 *
 */
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks,
        EasyPermissions.RationaleCallbacks {

    private static final int PERMISSION_CAMERA = 1000; //权限的请求码唯一即可
    String[] perms = {Manifest.permission.CAMERA}; //一些权限用逗号隔开

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        doSomethingWithCamera();

    }

    /**
     * 重写方法将权限请求结果传递给EasyPermission
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // 回调结果传递给EasyPermission
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    /**
     * 权限请求方法可直接调用
     */
    @AfterPermissionGranted(PERMISSION_CAMERA)
    public void doSomethingWithCamera() {

        if (EasyPermissions.hasPermissions(this, perms)) {

            //当前有权限时进行的操作
            //...

        } else {
            //没有权限去申请权限
            EasyPermissions.requestPermissions(
                    this, "该权限仅是实现拍摄音视频,请通过权限否则不能使用某些功能!", PERMISSION_CAMERA, perms);
        }
    }

    /**
     * 允许权限后触发
     */
    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
        Toast.makeText(this, "应用获得相机权限成功", Toast.LENGTH_LONG).show();
    }

    /**
     * 禁止权限后触发
     */
    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            //在权限弹窗中,用户勾选了'不在提示'且拒绝权限的情况触发
            new AppSettingsDialog.Builder(this).build().show(); //调用接口进入该应用的设置页面
        }
    }

    /**
     * 系统设置回调
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
            Toast.makeText(this, "相机权限为" + EasyPermissions.hasPermissions(this,
                    perms), Toast.LENGTH_LONG).show();
        }
    }

    /**
     * 由于各个厂商对Rationale的实现机制略有不同,考虑通用性,不建议实现以下该接口的两个方法
     */
    @Override
    public void onRationaleAccepted(int requestCode) {

    }

    @Override
    public void onRationaleDenied(int requestCode) {

    }


}

结语

EasyPermissions框架GitHub地址:https://github.com/googlesamples/easypermissions
部分内容借鉴此篇博客:http://t.csdn.cn/vBuzb / http://t.csdn.cn/NY1Jo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值