关于Android动态权限处理更友好的方式(Kotlin)

来源:互联网 发布:uplay有mac版本吗 编辑:程序博客网 时间:2024/06/05 04:24

用户拒绝权限(如图片选择拒绝存储权限后显示空页)后,完全不知道该干什么。这是我们应该指导用户去开启权限(因为很多时候手比脑子更快的就点击了拒绝)。如下图:
这里写图片描述

首先定义一个权限处理的工具类:

class PermissionUtils(private val context: Activity) {    private var mHasPermissionRunnable: Runnable? = null    private var mNoPermissionRunnable: Runnable? = null    private var REQUEST_CODE_PERMISSION = 1000    fun checkStoragePermission(hasPermissionDo: Runnable) {        var permission = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)        checkPermission(permission, hasPermissionDo, Runnable {            context.showPermissionDialog("不开启存储权限,无法访问相册哦~")        })    }    fun checkCameraPermission(hasPermissionDo: Runnable) {        var permission = arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)        checkPermission(permission, hasPermissionDo, Runnable {            context.showPermissionDialog("不开启相机权限,无法拍照哦~")        })    }    fun checkPermission(permissions: Array<out String>, hasPermissionDo: Runnable, noPermissionDo: Runnable) {        mHasPermissionRunnable = null        mNoPermissionRunnable = null        if (isPermissionsGranted(permissions)) hasPermissionDo.run()        else if (ActivityCompat.shouldShowRequestPermissionRationale(context, permissions.get(0))) {            noPermissionDo.run()        } else {            mHasPermissionRunnable = hasPermissionDo            mNoPermissionRunnable = noPermissionDo            ActivityCompat.requestPermissions(context, permissions, REQUEST_CODE_PERMISSION)        }    }     fun isPermissionsGranted(permissions: Array<out String>): Boolean {        for (it in permissions) {            if (ContextCompat.checkSelfPermission(context, it) != PackageManager.PERMISSION_GRANTED)                return false        }        return true    }    private fun isAllGranted(grantResults: IntArray): Boolean {        for (it in grantResults) {            if (it != PackageManager.PERMISSION_GRANTED) return false        }        return true    }    fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {        if (requestCode == REQUEST_CODE_PERMISSION) {            if (isAllGranted(grantResults))                mHasPermissionRunnable?.run()            else mNoPermissionRunnable?.run()        }    }

在Activity中重写onRequestPermissionsResult方法病调用permissionUtils的onRequestPermissionsResult方法

 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults)        permissionUtils?.onRequestPermissionsResult(requestCode, permissions, grantResults)    }

涉及到的对话框:

fun Activity.showPermissionDialog(message: String) {    showAlertDialog(message, "取消", "去开启", null, object : OnClickListener {        override fun onClick(v: View) {            val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)            intent.setData(Uri.parse("package:" + packageName))            startActivity(intent)        }    })}interface OnClickListener {    fun onClick(v: View)}fun Activity.showAlertDialog(message: String, leftStr: String, rightStr: String, leftListener: OnClickListener?, rightListener: OnClickListener?) {    val dialog = Dialog(this, R.style.mydialogstyle)    val view = inflate(this, R.layout.alert_dialog, null)    dialog.setContentView(view)    view.tv_alert_negative.text = leftStr    view.tv_alert_positive.text = rightStr    view.tv_alert_message.text = message    view.tv_alert_negative.setOnClickListener { v ->        leftListener?.onClick(v)        dialog.dismiss()    }    view.tv_alert_positive.setOnClickListener { v ->        rightListener?.onClick(v)        dialog.dismiss()    }    dialog.show()}

上面多出的对话框处理,仅仅是因为Android原生对话框不好看。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:background="@drawable/alert_dialog_bg_shape"    android:orientation="vertical">    <TextView        android:id="@+id/tv_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:layout_marginTop="10dp"        android:gravity="center"        android:text="温馨提示"        android:textColor="#8E8E8E" />    <TextView        android:textSize="16sp"        android:id="@+id/tv_alert_message"        android:layout_width="240dp"        android:layout_height="80dp"        android:layout_gravity="center"        android:gravity="center"        android:paddingLeft="24dp"        android:paddingRight="24dp"        android:textColor="#505050"        android:text="您确定结束此次咨询吗" />    <View        android:layout_width="match_parent"        android:layout_height="1dp"        android:background="#EFEFEF" />    <LinearLayout        android:id="@+id/ll_double_button"        android:layout_width="match_parent"        android:layout_height="54dp"        android:orientation="horizontal">        <TextView            android:textSize="17sp"            android:id="@+id/tv_alert_negative"            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="center"            android:text="取消"            android:textColor="#32333c" />        <View            android:layout_width="1dp"            android:layout_height="match_parent"            android:layout_gravity="center"            android:background="#EFEFEF" />        <TextView            android:textSize="17sp"            android:id="@+id/tv_alert_positive"            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="center"            android:padding="10dp"            android:text="确定"            android:textColor="#e93a3a" />    </LinearLayout></LinearLayout>
阅读全文
0 0
原创粉丝点击