遇到很尴尬的动态权限问题,终于找到一个用起来比较舒服的库,教程也很详细
示例代码
// ---------------------------------- kotlin -------------------------------------------------
frame_version_update.setOnClickListener {
val rxPermissions = RxPermissions(this)
rxPermissions
.requestEach(WRITE_EXTERNAL_STORAGE)
.subscribe({ permission ->
if (permission.granted) {
VersionManager().checkUpdate(this, true)
} else if (permission.shouldShowRequestPermissionRationale) {
// 点击了禁止,没有勾选 禁止再次询问
} else {
// 勾选了 禁止再次询问,跳转到权限设置页
DialogUtlis.showDialog(this,"您已禁止存储权限,是否打开?","取消","去打开",object:DialogListenser{
override fun sure() {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
val uri = Uri.fromParts("package",getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 0)
}
})
}
})
}
// ---------------------------------- java -------------------------------------------------
RxPermissions rxPermissions = new RxPermissions(container.activity); // where this is an Activity instance
rxPermissions
.requestEach(Manifest.permission.RECORD_AUDIO)
.subscribe(permission -> {
if (permission.granted) {
} else if (permission.shouldShowRequestPermissionRationale) {
// 点击了禁止,没有勾选 禁止再次询问
} else {
// 勾选了 禁止再次询问,跳转到权限设置页
DialogUtlis.INSTANCE.showDialog(container.activity, container.activity.getResources().getString(R.string.permission_audio_tips)
, container.activity.getResources().getString(R.string.permission_cancel)
, container.activity.getResources().getString(R.string.permission_sure)
, new DialogListenser() {
@Override
public void sure() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", container.activity.getPackageName(), null);
intent.setData(uri);
container.activity.startActivityForResult(intent, 0);
}
});
}
});
遇到的问题
多个权限,permission.granted 会被调多次,需要控制不要多次请求数据
rxPermissions
.requestEach(WRITE_EXTERNAL_STORAGE,READ_EXTERNAL_STORAGE)
.subscribe({ permission ->
if (permission.granted) {
// 两个权限,此回调会被调两次
} else if (permission.shouldShowRequestPermissionRationale) {
// 点击了禁止,没有勾选 禁止再次询问
} else {
// 勾选了 禁止再次询问,跳转到权限设置页
}
})
}
})
关于交互
用户禁止再次询问该权限,就不会再弹出权限申请框了
只能让用户去 设置-权限管理 中打开,才能使用相关功能。
可以直接跳转到权限设置页面
让用户通过很复杂的方式去打开权限是一个很糟糕的体验
跳转到权限设置页
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
val uri = Uri.fromParts("package", context.getPackageName(), null);
intent.setData(uri);
startActivityForResult(context as Activity, intent,0,null)
写在最后
简单封装一个Dialog工具类,没必要再导入一个Dialog的第三方库了,仅作记录:
/**
*
* author : 王宏杰
* time : 2018/06/19
* function : Dialog 简单封装
* version: 1.0
*
*/
object DialogUtlis {
fun showDialog(context: Context, title: String, btnLeft: String, btnRight: String,listenser:DialogListenser) {
val view = View.inflate(context, R.layout.layout_update_version, null)
val updateBtn = view.findViewById(R.id.btn_update)
val cancelBtn = view.findViewById(R.id.btn_cancel)
val content = view.findViewById(R.id.txt_login_out_content)
updateBtn.text = btnRight
cancelBtn.text = btnLeft
content.text = title
val dialog = Dialog(context)
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialog.setContentView(view)
dialog.setCancelable(true)
dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialog.show()
updateBtn.setOnClickListener {
listenser.sure()
dialog.dismiss()
}
cancelBtn.setOnClickListener {
dialog.dismiss()
}
}
}
interface DialogListenser{
fun sure()
}