//第一步 manifest:
<uses-permission android:name="android.permission.CALL_PHONE" />
//第二步 第三方库依赖:
//2.申请权限三方依赖库
implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
//第三步 工具类:
/**
* 申请权限相关工具类
*
* @author CJF
*/
public class PermissionUtil {
private final String TAG = "PermissionUtil";
private volatile static PermissionUtil permissionUtil = null;
/**
* 录音权限
*/
private final String recordAudio = Manifest.permission.RECORD_AUDIO;
/**
* 读取外部存储权限
*/
private final String readExternalStorage = Manifest.permission.READ_EXTERNAL_STORAGE;
/**
* 写入外部存储权限
*/
private final String writeExternalStorage = Manifest.permission.WRITE_EXTERNAL_STORAGE;
/**
* 获取粗略位置权限
*/
private final String coarseLocation = Manifest.permission.ACCESS_COARSE_LOCATION;
/**
* 获取精确位置权限
*/
private final String fineLocation = Manifest.permission.ACCESS_FINE_LOCATION;
/**
* 获取精确位置权限
*/
private final String callPhone = Manifest.permission.CALL_PHONE;
/**
* 权限数组
*/
// private final String[] permissions = {recordAudio, readExternalStorage, writeExternalStorage, coarseLocation, fineLocation};
private final String[] permissions = {callPhone};
/**
* 弹窗
*/
private SelectDialog selectDialog;
private AppCompatActivity activity;
public static PermissionUtil getInstance() {
if (null == permissionUtil) {
synchronized (PermissionUtil.class) {
if (null == permissionUtil) {
permissionUtil = new PermissionUtil();
}
}
}
return permissionUtil;
}
/**
* 逐个申请权限
* 申请权限 每次单个申请
*/
public void requestSinglePermission(AppCompatActivity activity) {
this.activity = activity;
//判断权限是否已经全部拥有
if (isPermissionGranted(activity)) {
Log.d(TAG, "权限全部拥有 return");
//关闭弹窗
if (null != selectDialog && selectDialog.isShowing()) {
selectDialog.cancel();
}
return;
}
//申请权限三方库
RxPermissions rxPermissions = new RxPermissions(activity);
//申请权限
for (String permission : permissions) {
boolean isGranted = rxPermissions.isGranted(permission);
if (!isGranted) {
rxPermissions.requestEach(permission).subscribe(new Observer<Permission>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Permission permission) {
String name = permission.name;
boolean granted = permission.granted;
Log.d(TAG, "申请" + name + ":" + granted);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
boolean granted = rxPermissions.isGranted(permission);
if (granted) {
requestSinglePermission(activity);
} else {
//关闭弹窗
if (null != selectDialog && selectDialog.isShowing()) {
selectDialog.cancel();
}
//获取权限名称
String permissionName = getPermissionName(permission);
selectDialog = new SelectDialog(activity, "请同意" + permissionName + "权限,否则影响使用", new SelectDialog.DialogListen() {
@Override
public void onClickOk(SelectDialog dialog) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + activity.getPackageName()));
activity.startActivity(intent);
}
@Override
public void onClickCancel(SelectDialog dialog) {
requestSinglePermission(activity);
}
});
}
}
});
return;
}
}
Log.d(TAG, "1111");
}
/**
* 一次申请多个权限
* 申请权限 数组多个申请
*/
public void requestMultiplePermissions(AppCompatActivity activity) {
this.activity = activity;
//判断权限是否已经全部拥有
if (isPermissionGranted(activity)) {
Log.d(TAG, "权限全部拥有 return");
return;
}
//申请权限三方库
RxPermissions rxPermissions = new RxPermissions(activity);
//申请权限
rxPermissions.requestEach(permissions).subscribe(new Observer<Permission>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Permission permission) {
String name = permission.name;
boolean granted = permission.granted;
Log.d(TAG, "申请" + name + ":" + granted);
if (!granted) {
//关闭弹窗
if (null != selectDialog && selectDialog.isShowing()) {
selectDialog.cancel();
}
//获取权限名称
String permissionName = getPermissionName(name);
selectDialog = new SelectDialog(activity, "请同意" + permissionName + "权限,否则影响使用", new SelectDialog.DialogListen() {
@Override
public void onClickOk(SelectDialog dialog) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + activity.getPackageName()));
activity.startActivity(intent);
}
@Override
public void onClickCancel(SelectDialog dialog) {
requestMultiplePermissions(activity);
}
});
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
if (isPermissionGranted(activity)) {
Log.d(TAG, "权限全部拥有");
//关闭弹窗
if (null != selectDialog && selectDialog.isShowing()) {
selectDialog.cancel();
}
}
}
});
Log.d(TAG, "1111");
}
/**
* 判断权限是否已经全部拥有
*
* @param activity
* @return
*/
public boolean isPermissionGranted(AppCompatActivity activity) {
RxPermissions rxPermissions = new RxPermissions(activity);
for (String permission : permissions) {
if (!rxPermissions.isGranted(permission)) {
Log.d(TAG, "权限不完整");
return false;
}
}
Log.d(TAG, "权限全部拥有");
return true;
}
/**
* 判断权限是否已经全部拥有
*
* @param context
* @return
*/
public boolean isPermissionGranted(Context context) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "权限不完整");
return false;
}
}
Log.d(TAG, "权限全部拥有");
return true;
}
/**
* 获取权限名称
*
* @param permission
* @return
*/
private String getPermissionName(String permission) {
switch (permission) {
case recordAudio:
return "录音";
case readExternalStorage:
case writeExternalStorage:
return "读写";
case coarseLocation:
case fineLocation:
return "定位";
default:
return "";
}
}
}
//第四步 调用:
PermissionUtil.getInstance().requestMultiplePermissions(this);
//--------------------------------------------------------------------完---------------------------------------------------------------------------