简单Android 6.0权限处理
2017-10-26 10:37
477 查看
权限处理工具类
代码:/** * 6.0 运行时权限处理工具类。 */ object MPermissionUtils { private var mRequestCode = -1 var settingRequestCode = 1 fun requestPermissionsResult(activity: Activity, requestCode: Int, permission: Array<String>, callback: OnPermissionListener) { requestPermissions(activity, requestCode, permission, callback) } fun requestPermissionsResult(fragment: android.app.Fragment, requestCode: Int, permission: Array<String>, callback: OnPermissionListener) { requestPermissions(fragment, requestCode, permission, callback) } fun requestPermissionsResult(fragment: android.support.v4.app.Fragment, requestCode: Int, permission: Array<String>, callback: OnPermissionListener) { requestPermissions(fragment, requestCode, permission, callback) } /** * 请求权限处理 * @param object activity or fragment * @param requestCode 请求码 * @param permissions 需要请求的权限 * @param callback 结果回调 */ @TargetApi(Build.VERSION_CODES.M) private fun requestPermissions(obj: Any, requestCode: Int, permissions: Array<String>, callback: OnPermissionListener) { checkCallingObjectSuitability(obj) mOnPermissionListener = callback if (checkPermissions(getContext(obj), *permissions)) { mOnPermissionListener.onPermissionGranted() } else { val deniedPermissions = getDeniedPermissions(getContext(obj), *permissions) if (deniedPermissions.isNotEmpty()) { mRequestCode = requestCode when (obj) { is Activity -> obj.requestPermissions(deniedPermissions.toTypedArray(), requestCode) is android.app.Fragment -> obj.requestPermissions(deniedPermissions.toTypedArray(), requestCode) is android.support.v4.app.Fragment -> obj.requestPermissions(deniedPermissions.toTypedArray(), requestCode) else -> mRequestCode = -1 } } } } /** * 获取上下文 */ private fun getContext(obj: Any): Context { return when (obj) { is Fragment -> obj.activity is android.support.v4.app.Fragment -> obj.activity else -> obj as Activity } } /** * 请求权限结果,对应onRequestPermissionsResult()方法。 */ fun onRequestPermissionsResult(re ab8b questCode: Int, grantResults: IntArray) { if (mRequestCode != -1 && requestCode == mRequestCode) { if (verifyPermissions(grantResults)) { mOnPermissionListener.onPermissionGranted() } else { mOnPermissionListener.onPermissionDenied() } } } /** * 显示提示对话框 */ fun showTipsDialog(activity: Activity) { AlertDialog.Builder(activity) .setTitle("提示") .setMessage("说明原因") .setNegativeButton("取消"), null) .setPositiveButton("确定", { _: DialogInterface, _: Int -> startAppSettings(activity) } ).show() } /** * 启动当前应用设置页面 */ private fun startAppSettings(activity: Activity) { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) intent.data = Uri.parse("package:" + activity.packageName) activity.startActivityForResult(intent, settingRequestCode) } /** * 验证权限是否都已经授权 */ private fun verifyPermissions(grantResults: IntArray): Boolean { return grantResults.none { it != PackageManager.PERMISSION_GRANTED } } /** * 获取权限列表中所有需要授权的权限 * @param context 上下文 * @param permissions 权限列表 * @return */ private fun getDeniedPermissions(context: Context, vararg permissions: String): List<String> { return permissions.filter { ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_DENIED } } /** * 检查所传递对象的正确性 * @param object 必须为 activity or fragment */ private fun checkCallingObjectSuitability(obj: Any?) { if (obj == null) { throw NullPointerException("Activity or Fragment should not be null") } val isActivity = obj is Activity val isSupportFragment = obj is android.support.v4.app.Fragment val isAppFragment = obj is android.app.Fragment if (!(isActivity || isSupportFragment || isAppFragment)) { throw IllegalArgumentException("Caller must be an Activity or a Fragment") } } /** * 检查所有的权限是否已经被授权 * @param permissions 权限列表 * @return */ private fun checkPermissions(context: Context, vararg permissions: String): Boolean { if (isOverMarshmallow()) { permissions.filter { ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_DENIED } .forEach { return false } } return true } /** * 判断当前手机API版本是否 >= 6.0 */ private fun isOverMarshmallow(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M } interface OnPermissionListener { fun onPermissionGranted() fun onPermissionDenied() } private lateinit var mOnPermissionListener: OnPermissionListener }
使用:
private fun check() { val permissions = arrayOf(ACCESS_COARSE_LOCATION, CAMERA, WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE) MPermissionUtils.requestPermissionsResult(this, 1, permissions, object : MPermissionUtils.OnPermissionListener { override fun onPermissionGranted() { //请求成功 todo } override fun onPermissionDenied() { MPermissionUtils.showTipsDialog(this) } }) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == MPermissionUtils.settingRequestCode) { check() } } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { MPermissionUtils.onRequestPermissionsResult(requestCode, grantResults) super.onRequestPermissionsResult(requestCode, permissions, grantResults) }
相关文章推荐
- PermissionsDispatcher库的使用(简单处理Android 6.0系统中的运行时权限的开源库)
- Android 6.0 运行时权限简单处理
- Android 6.0 运行时权限简单处理
- Android 6.0 动态权限申请简单简洁优雅的处理方式
- Android 6.0及以上权限处理
- Android 6.0 运行时权限处理
- Android 6.0 运行时权限处理
- Android 6.0 运行时权限处理
- 项目中处理android 6.0权限管理问题
- Android 6.0 动态权限申请封装的处理方式
- Android 6.0 运行时权限处理
- Robotium测试中关于Android 6.0 权限对话框的处理
- Android 6.0 运行时权限处理完全解析
- Android 6.0以上权限处理
- Android 6.0 运行时权限处理完全解析
- android简单学习6.0的动态权限申请
- Android 6.0 运行时权限处理
- Android 6.0 运行时权限处理
- Android 6.0运行时权限处理
- Android,6.0权限,简单实现,好用的框架