前言
之前有讲到PermissionsDispatcher动态权限申请
的使用,大叫感兴趣的话可参考
PermissionsDispatcher动态权限申请
PermissionsDispatcher动态权限申请kotlin版
不得不说PermissionsDispatcher
库还是很厉害的。然后又看了下其他的权限库,发现RxPermission
用得也比较多,为了方便使用,我将RxPermission
做了下简单的封装PermissionHelper2
,下面就来讲讲它的使用吧。
今天涉及内容:
- 添加依赖
- PermissionHelper2简单介绍
- PermissionHelper2在activity中使用
- 效果图及项目结构图
- PermissionHelper2及相关源码
一. 添加依赖
rxpermissions
借助了rxandroid
和rxjava
进行构建,项目中也需要依赖rxandroid
和rxjava
相关库。
在项目app_nodule
对应的build.gradle
中添加依赖:
dependencies {
//rxandroid3.x
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
//rxjava3.x
implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
//rxpermissions
implementation 'com.github.tbruyelle:rxpermissions:0.12'
//其他代码此处忽略
//......
}
二. PermissionHelper2简单介绍
PermissionHelper2
是一个单例类,其初始化如下:
PermissionHelper2.getInstance()
此类涉及以下常用方法:
/***
* 申请单个权限
*
* 注: 同意后再申请此权限则不再弹出提示框
*
* @param permission:权限,如 Manifest.permission.READ_EXTERNAL_STORAGE
* @param activityOrFragment:FragmentActivity或 Fragment实例
* @return access: true:申请成功 fasle:申请失败
*/
public void request(String permission, ViewModelStoreOwner activityOrFragment, IPermissionResultListener listener) ;
/***
* 申请单个权限,获得详细信息
*
* @param permission 权限,如 Manifest.permission.READ_EXTERNAL_STORAGE
* @param activityOrFragment FragmentActivity或 Fragment实例
*/
public void requestInfo(String permission, ViewModelStoreOwner activityOrFragment, IPermissionResultInfoListener listener)
/***
* 申请多个权限(返回一个permission对象)
*
* 注: 只要有一个禁止,则返回false;全部同意,则返回true
* 某个权限同意后,之后再申请此权限则不再弹出提示框,其他的会继续弹出
*
* @param permissions 权限数组
* @param activityOrFragment FragmentActivity或 Fragment实例
* @return access: true:申请成功 fasle:申请失败
*/
public void requestEach(String permissions[], ViewModelStoreOwner activityOrFragment, IPermissionResultListener listener)
/***
* 申请多个权限,获得详细信息(返回多个permission对象)
*
* @param permissions 权限数组
* @param activityOrFragment FragmentActivity或 Fragment实例
*/
public void requestEachInfo(String permissions[], ViewModelStoreOwner activityOrFragment, IPermissionResultInfoListener listener)
/***
* 申请多个权限,获取合并后的详细信息
*
* @param permissions 权限数组
* @param activityOrFragment FragmentActivity或 Fragment实例
*/
public void requestEachCombinedInfo(String permissions[], ViewModelStoreOwner activityOrFragment, IPermissionResultInfoListener listener)
/**
* 检查某个权限是否被申请
*
* @param permisson 权限数组
* @param activityOrFragment FragmentActivity或 Fragment实例
* @return true:有该权限 fasle:无该权限
*/
public boolean checkPermission(String permisson, ViewModelStoreOwner activityOrFragment)
三. PermissionHelper2在activity中使用
在使用之前,需要在Manifast.xml
中添加以下权限:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
然后,为了兼容Android10
权限申请,需要在Manifast.xml
文件的自定义application
标签中添加如下属性:
<application
android:requestLegacyExternalStorage="true" //添加此属性兼容Android10
//其他代码省略
//......
>
<activity
.../>
......
</application>
下面以拍照和文件读写权限申请为例,再添加以上所述之外,Manifast.xml
中需要追加以下三个权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
下面给出PermissionHelper2
在MainActivity
中调用代码:
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.tbruyelle.rxpermissions3.Permission;
import com.testdemo.util.Util;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mTv;
private Button mBtn;
private Button mBtn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
setListener();
}
private void initView() {
mTv = findViewById(R.id.tv_text);
mBtn = findViewById(R.id.btn_test);
mBtn2 = findViewById(R.id.btn_test2);
}
private void initData() {
}
private void setListener() {
mBtn.setOnClickListener(this);
mBtn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_test:
//申请单个权限
String permission = Manifest.permission.CAMERA;
PermissionHelper2.getInstance().requestInfo(permission, MainActivity.this, new PermissionHelper2.IPermissionResultInfoListener() {
@Override
public void checkPermission(Permission permission) {
if (permission.granted) {//All权限同意后调用
Util.i("======权限都通过=======");
toast("====权限申请成功===");
} else if (permission.shouldShowRequestPermissionRationale) {
//只要有一个选择:禁止,但没有选择“以后不再询问”,以后申请权限,会继续弹出提示
Util.i(" 拒绝权限,并没有勾选‘不再询问’,下次点击会继续弹出提示=");
toast("====权限申请失败===");
} else {
// but有个问题:去设置页面手动开启权限后回到app,回调不能自动执行允许权限的代码,
// 即没办法自动进入App,需要重启App才正常,是否可以在onResume()里处理?
Util.i("======弹框去设置界面=======");
showAlertDialog("权限申请",
"需要获取手机相关权限,是否去设置界面?",
"确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//去设置界面
goToSetting(MainActivity.this);
}
},
"取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Util.i("========取消了权限======");
}
});
}
}
});
break;
case R.id.btn_test2:
//申请一组权限
String permissons[] = {Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
PermissionHelper2.getInstance().requestEachCombinedInfo(permissons, MainActivity.this, new PermissionHelper2.IPermissionResultInfoListener() {
@Override
public void checkPermission(Permission permission) {
if (permission.granted) {//All权限同意后调用
Util.i("======所有权限申请成功=======");
toast("====所有权限申请成功===");
} else if (permission.shouldShowRequestPermissionRationale) {
//只要有一个选择:禁止,但没有选择“以后不再询问”,以后申请权限,会继续弹出提示
Util.i(" 拒绝权限,并没有勾选‘不再询问’,下次点击会继续弹出提示=");
toast("====部分权限申请失败===");
} else {
// but有个问题:去设置页面手动开启权限后回到app,回调不能自动执行允许权限的代码,
// 即没办法自动进入App,需要重启App才正常,是否可以在onResume()里处理?
Util.i("======弹框去设置界面=======");
showAlertDialog("权限申请",
"需要获取手机相关权限,是否去设置界面?",
"确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//去设置界面
goToSetting(MainActivity.this);
}
},
"取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Util.i("========取消了权限======");
}
});
}
}
});
break;
default:
break;
}
}
/**
* 含有标题、内容、两个按钮的对话框
**/
protected AlertDialog showAlertDialog(String title, String message, String positiveText,
DialogInterface.OnClickListener onPositiveClickListener, String negativeText,
DialogInterface.OnClickListener onNegativeClickListener) {
AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle(title).setMessage(message)
.setPositiveButton(positiveText, onPositiveClickListener).setNegativeButton(negativeText, onNegativeClickListener).show();
return alertDialog;
}
protected void toast(String message) {
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
}
/***
* 去设置界面
*/
public static void goToSetting(Context context) {
//go to setting view
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(), null);
intent.setData(uri);
context.startActivity(intent);
}
}
四. 效果图及项目结构图
申请单个权限.gif 申请多个权限.gif 项目结构图.png五. PermissionHelper2及相关源码
在PermissionHelper2
使用前涉及到一个工具类的Util
,下面给出Util
类代码:
网友评论