权限的适配也算是一个比较让开发者脑袋大的问题了,一些国产品牌的手机申请成功了其实没有权限等各种蛋疼的问题。
前段日子看了个好心人大神git上一个开源,挺好的,先贴出它的地址:
https://github.com/jokermonn/permissions4m
首先感谢大神的分享。
下面我用Kotlin写了个简单的Demo。
添加依赖:
project中的build.gradle:
allprojects { repositories { maven { url 'https://jitpack.io' } } }
app 中的 build.gradle:
dependencies { compile 'com.github.jokermonn:permissions4m:2.1.2-lib' annotationProcessor 'com.github.jokermonn:permissions4m:2.1.2-processor' }
AndroidManifest中声明:
<uses-permission android:name="android.permission.CAMERA"/>
override fun onClick(v: View?) { when(v?.id){ // 拍照 R.id.btn_show_tv ->{ requestOnePermission() } } }
在申请之前要在activity申请回调中添加:
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { Permissions4M.onRequestPermissionsResult(this, requestCode, grantResults) super.onRequestPermissionsResult(requestCode, permissions, grantResults) }
下面就看看具体申请的方法,大神的链接里都是Java代码。注释也很清楚,我就贴一下Kotlin的吧:
/** * 单个权限申请 */ fun requestOnePermission(){ Permissions4M.get(this) // 是否强制弹出权限申请对话框,建议为 true,默认为 true .requestForce(false) // 是否支持5.0权限申请 默认false .requestUnderM(false) // 权限 .requestPermissions(Manifest.permission.CAMERA) // 权限申请码 .requestCodes(1) // 权限请求结果 .requestListener(object : ListenerWrapper.PermissionRequestListener{ override fun permissionGranted(code: Int) { when(code){ 1 -> Toast.makeText(this@HomeActivity, "相机权限授权成功", Toast.LENGTH_SHORT).show() } } override fun permissionDenied(code: Int) { when(code){ 1 -> Toast.makeText(this@HomeActivity, "相机权限授权失败", Toast.LENGTH_SHORT).show() } } override fun permissionRationale(code: Int) { when(code){ 1 -> Toast.makeText(this@HomeActivity, "请开启相机权限", Toast.LENGTH_SHORT).show() } } }) // 权限完全被禁时回调函数中返回 intent 类型(系统设置界面) .requestPageType(Permissions4M.PageType.ANDROID_SETTING_PAGE) // 权限完全被禁时回调,接口函数中的参数 Intent 是由上一行决定的 .requestPage { _, p1 -> AlertDialog.Builder(this) .setMessage("相机权限申请:\n我们需要开启照相机的权限") .setPositiveButton("确定") { _, _ -> this.startActivity(p1) } .setNegativeButton("取消") { dialog, _ -> dialog.cancel() } .show() } .request() }