目录

目录.png
文件结构

结构.png
思路

param.png
每一个asker 有很多属性, 有三个方法【请求时】【用户处理后】【用户前往设置界面处理后】
工具代码
接口
public interface OnAskAppearListener {
void onAppear();
}
工具类
public class PermissionAsker {
private Activity activity;//activity
private OnAskAppearListener listener;//申请权限时要执行的事件
private String permission;//权限
private int permissionCode;//权限申请码,不同权限,不能冲突
private int activityCode;//设置界面权限申请码,不同权限不能冲突
private boolean popTip;//是否要弹出提示跳转权限设置界面
private String askReason;//权限跳转提示语句
/**
* 构造一个asker
* @param activity activity
* @param listener 申请权限时要执行的事件
* @param permisstion 权限
* @param permissionCode 权限申请的requestCode
* @param activityCode 跳转到设置界面的requestCode
* @param askReason 是否弹出dialog跳转到权限设置
* @param popTip 弹出dialog提示语句
*/
public PermissionAsker(Activity activity,OnAskAppearListener listener, String permisstion, int permissionCode, int activityCode, String askReason, boolean popTip){
this.activity = activity;
this.listener = listener;
this.permission = permisstion;
this.permissionCode = permissionCode;
this.activityCode = activityCode;
this.popTip = popTip;
this.askReason = askReason;
}
/**
* 请求时
*/
public void onAsk(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
activity.requestPermissions(new String[]{permission},permissionCode);
}
else{
listener.onAppear();
}
}
/**
* 权限申请对方选取是否拒绝后
* @param requestCode
* @param grantResults
*/
public void onChoose(int requestCode, int[] grantResults){
if (requestCode == permissionCode){
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
listener.onAppear();
}else{
if (popTip){
AlertDialog.Builder dialog = new AlertDialog.Builder(activity).setTitle("权限申请").setMessage(askReason)
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
goToAppSetting();
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
dialog.show();
}
}
}
}
/**
* 设置界面返回后
* @param requestCode
*/
public void onSet(int requestCode){
if (requestCode == activityCode &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
ActivityCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED) {
listener.onAppear();
}
}
// 跳转到当前应用的设置界面
private void goToAppSetting() {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
activity.startActivityForResult(intent, activityCode);
}
}
使用代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private PermissionAsker askerRead;//申请写入权限
private PermissionAsker askerWrite;//申请读取权限
private PermissionAsker askerRecode;//申请录音权限
private PermissionAsker askerCamera;//申请拍照权限
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
askerRead = new PermissionAsker(this, new OnAskAppearListener() {
@Override
public void onAppear() {
Toast.makeText(MainActivity.this, "已经成功获取文件读取权限", Toast.LENGTH_SHORT).show();
}
},Manifest.permission.READ_EXTERNAL_STORAGE,2,2, "为了测试,我希望申请文件读取权限",true);
askerWrite = new PermissionAsker(this, new OnAskAppearListener() {
@Override
public void onAppear() {
Toast.makeText(MainActivity.this, "已经成功获取文件写入权限", Toast.LENGTH_SHORT).show();
}
},Manifest.permission.WRITE_EXTERNAL_STORAGE,3,3, "为了测试,我希望申请文件写入权限",true);
askerRecode = new PermissionAsker(this, new OnAskAppearListener() {
@Override
public void onAppear() {
Toast.makeText(MainActivity.this, "已经成功获取录音权限", Toast.LENGTH_SHORT).show();
}
},Manifest.permission.RECORD_AUDIO,4,4, "为了测试,我希望申请录音权限",false);
askerCamera = new PermissionAsker(this, new OnAskAppearListener() {
@Override
public void onAppear() {
Toast.makeText(MainActivity.this, "已经成功获取拍照权限", Toast.LENGTH_SHORT).show();
}
},Manifest.permission.CAMERA,5,5, "为了测试,我希望申请拍照权限",false);
findViewById(R.id.btn_read).setOnClickListener(this);
findViewById(R.id.btn_write).setOnClickListener(this);
findViewById(R.id.btn_recode).setOnClickListener(this);
findViewById(R.id.btn_carame).setOnClickListener(this);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
askerRead.onChoose(requestCode, grantResults);
askerWrite.onChoose(requestCode, grantResults);
askerRecode.onChoose(requestCode, grantResults);
askerCamera.onChoose(requestCode, grantResults);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
askerRead.onSet(requestCode);
askerWrite.onSet(requestCode);
askerRecode.onSet(requestCode);
askerCamera.onSet(requestCode);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_read:
askerRead.onAsk();
break;
case R.id.btn_write:
askerWrite.onAsk();
break;
case R.id.btn_recode:
askerRecode.onAsk();
break;
case R.id.btn_carame:
askerCamera.onAsk();
break;
}
}
}
demo
网友评论