用户拒绝权限(如图片选择拒绝存储权限后显示空页)后,完全不知道该干什么。这是我们应该指导用户去开启权限(因为很多时候手比脑子更快的就点击了拒绝)。如下图:
首先定义一个权限处理的工具类:
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>