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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyantan/article/details/77452962

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

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

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>

猜你喜欢

转载自blog.csdn.net/xiaoyantan/article/details/77452962