Android权限相关(检查申请回调)
Posted 夜尽天明89
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android权限相关(检查申请回调)相关的知识,希望对你有一定的参考价值。
最近要整理个老项目,权限那块需要改,就回顾了下权限相关的,在此整理下。
这里用到的是 permissionsdispatcher
下面是简单的使用,详细的去看
1、先检查下 build.gradle 中是否有
apply plugin: "kotlin-kapt"
这句话,没有的话再顶部加上;
2、添加依赖
implementation "org.permissionsdispatcher:permissionsdispatcher:4.5.0"
kapt "org.permissionsdispatcher:permissionsdispatcher-processor:4.5.0"
3、开始使用
第一种用法:
import permissions.dispatcher.NeedsPermission
import permissions.dispatcher.OnPermissionDenied
import permissions.dispatcher.RuntimePermissions
@RuntimePermissions
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
permissionNeedWithPermissionCheck()
@NeedsPermission(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
)
fun permissionNeed()
Log.e("permissionNeed", "权限获取成功")
@OnPermissionDenied(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
)
fun permissionDenied()
Log.e("permissionDenied", "权限获取失败")
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
)
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
Log.e(
"requestCode = $requestCode",
" per = $permissions[0] ;grantResults = $grantResults"
)
onRequestPermissionsResult(requestCode, grantResults)
说明:
1、为了验证多个权限的处理。我同时申请了 读写、拍照;刚写完上面的方法,onRequestPermissionsResult 可能会报错(报红),就clean、rebuild
2、permissionNeed 是自己定义的方法,用于处理 申请的权限都被同意的 情况。注意,(以这里为例)读写、拍照都通过了,就会走到这个方法里面
3、permissionDenied 是自己定义的方法,如果 申请的权限中有任何一个拒绝了,就会走到这里。
clean、rebuild后,就不报错了,这个时候,在需要触发权限申请的地方,调用(我这里是 Activity - onCreate)
permissionNeedWithPermissionCheck()
就会开始申请权限。
这个方法是build的时候,自动生成的。名字分两部分 permissionNeed+WithPermissionCheck。前半部分,是刚自己写的
下面是日志
1、读写、拍照都授权
requestCode = 0: per = android.permission.READ_EXTERNAL_STORAGE ;grantResults = [I@62ae615
permissionNeed: 权限获取成功
2、读写同意、拍照拒绝---读写拒绝、拍照同意---读写、拍照都拒绝
requestCode = 0: per = android.permission.READ_EXTERNAL_STORAGE ;grantResults = [I@62ae615
permissionDenied: 权限获取失败
第二种用法
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
),
1
);
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
)
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
Log.e(
"requestCode = $requestCode",
" per = $permissions[0] ;grantResults = $grantResults"
)
if (requestCode == 1)
when (permissions[0])
Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE ->
Log.e("回调", "读写")
if (PermissionUtils.verifyPermissions(*grantResults))
Log.e("回调", "读写授权成功")
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.CAMERA
),
1
);
else
Log.e("回调", "读写授权失败")
Manifest.permission.CAMERA ->
Log.e("回调", "相册")
if (PermissionUtils.verifyPermissions(*grantResults))
Log.e("回调", "相册授权成功")
else
Log.e("回调", "相册授权失败")
说明:
1、这里我用了链式的。也就是 先读写后拍照 的顺序。requestCode 我都用了1,具体到项目中根据实际情况来
2、如果刚开始的读写被拒绝了,根据上面的操作,就不会再去申请拍照了。具体需要具体区分
以上两种权限的申请、回调,各有优缺点。根据自己的项目实际情况选择
至于判断有无某个(某些)权限,常用方法有2个:
PermissionUtils.hasSelfPermissions
PermissionUtils.verifyPermissions
对应的源码是
/**
* Returns true if the Activity or Fragment has access to all given permissions.
*
* @param context context
* @param permissions permission list
* @return returns true if the Activity or Fragment has access to all given permissions.
*/
public static boolean hasSelfPermissions(Context context, String... permissions)
for (String permission : permissions)
if (permissionExists(permission) && !hasSelfPermission(context, permission))
return false;
return true;
/**
* Checks all given permissions have been granted.
*
* @param grantResults results
* @return returns true if all permissions have been granted.
*/
public static boolean verifyPermissions(int... grantResults)
if (grantResults.length == 0)
return false;
for (int result : grantResults)
if (result != PackageManager.PERMISSION_GRANTED)
return false;
return true;
上面的第二种方法中,因为 onRequestPermissionsResult 直接返回了 grantResults,就用了 PermissionUtils.verifyPermissions。
PermissionUtils.hasSelfPermissions 的用法是:
PermissionUtils.hasSelfPermissions(
this,
Manifest.permission.READ_EXTERNAL_STORAGE
)
PermissionUtils.hasSelfPermissions(
this,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
以上是关于Android权限相关(检查申请回调)的主要内容,如果未能解决你的问题,请参考以下文章