关于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
- 关于Android动态权限处理更友好的方式(Kotlin)
- android程序出错了怎么更友好的处理
- Android 自动完全组件(SocialTokenAutoComplete)—— 一种更友好的方式@某人在社交应用中
- Android 权限管理(Kotlin)
- android 如果编写更友好的用户提示
- Android 6.0: 动态权限管理的处理
- Android 6.0动态权限申请的处理
- Android 6.0动态权限处理的封装
- 关于 android 6.0的权限处理
- 关于android权限的一些处理
- java web异常友好页面处理的方式
- Android 6.0+ 动态权限 一种清爽的封装过程(以及多个权限的处理)
- Android 6.0+ 动态权限 一种清爽的封装过程(以及多个权限的处理)
- Android 6.0+ 动态权限 一种清爽的封装过程(以及多个权限的处理)
- Android 6.0动态权限及小米(MIUI)权限的特殊处理
- android 6.0 动态权限处理
- android 6.0 动态权限处理
- kotlin-for-android简介 (让你的Android代码更简洁)
- light oj 1007 Mathematically Hard (欧拉函数)
- java服务端,支付宝支付代码笔记
- 值传递和地址传递 实参和形参
- (CSU
- 26.Scala中模式匹配入门实战详解
- 关于Android动态权限处理更友好的方式(Kotlin)
- 列表实现树形菜单
- 改变MyEclipse代码提示风格(Warnings\Error等)
- MVC界面开发包Essential Studio for ASP.NET MVC发布2017 v3
- 关于一些Tomcat的错误
- redirect uri 参数错误
- 线性代数总结
- 【转】树的基本概念以及性质
- JeePlus后台JSP页面编写指南