美文网首页
Android 动态权限库推荐

Android 动态权限库推荐

作者: 南窗云 | 来源:发表于2018-06-19 19:28 被阅读0次

遇到很尴尬的动态权限问题,终于找到一个用起来比较舒服的库,教程也很详细

示例代码

// ---------------------------------- 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的第三方库了,仅作记录:

/**
 * <pre>
 *     author : 王宏杰
 *     time   : 2018/06/19
 *     function   :  Dialog 简单封装
 *     version: 1.0
 * </pre>
 */

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<TextView>(R.id.btn_update)
        val cancelBtn = view.findViewById<TextView>(R.id.btn_cancel)
        val content = view.findViewById<TextView>(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()
}

相关文章

网友评论

      本文标题:Android 动态权限库推荐

      本文链接:https://www.haomeiwen.com/subject/mwrzeftx.html