实现效果
准备工作第一步 添加依赖
根据自己使用的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'
}
准备工作第二步 引用接口
在需要权限页面的Activity里implements框架接口:
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.CALENDAR | android.permission.READ_CALENDAR android.permission.WRITE_CALENDAR | 允许程序读取用户日历数据 允许一个程序写入但不读取用户日历数据 |
android.permission-group.CAMERA | android.permission.CAMERA | 允许访问摄像头进行拍照 |
android.permission-group.CONTACTS | android.permission.READ_CONTACTS android.permission.WRITE_CONTACTS android.permission.GET_ACCOUNTS | 允许程序读取用户联系人数据 允许程序写入但不读取用户联系人数据 访问一个帐户列表在Accounts Service中 |
android.permission-group.LOCATION | android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION | 允许一个程序访问精良位置(如GPS) 允许一个程序访问CellID或WiFi热点来获取粗略的位置 |
android.permission-group.MICROPHONE | android.permission.RECORD_AUDIO | 允许程序录制音频 |
android.permission-group.PHONE | android.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.SENSORS | android.permission.BODY_SENSORS | 允许该应用存取监测您身体状况的传感器所收集的数据,例如您的心率 |
android.permission-group.SMS | android.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.STORAGE | android.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