用checkCallingOrSelfPermission代替c
2020-09-08 本文已影响0人
愛與誠
之前在项目中遇到了一个问题,系统内置安装后,WRITE_EXTERNAL_STORAGE没有系统弹窗,但回调中权限检查不过,同时用户自行设置也无效。
使用checkSelfPermission检查WRITE_EXTERNAL_STORAGE结果为true,但activity的onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)回调中grantResults对应的结果为PackageManager.PERMISSION_DENIED
普通安装则没有这个问题。为什么呢?
我的尝试:
1.WRITE_EXTERNAL_STORAGE改为READ_EXTERNAL_STORAGE。推测前者被ROM授予了权限,同时也将用户对权限的操作作废了。但是如果请求同组的READ_EXTERNAL_STORAGE,则存储权限弹窗能露出,问题解决
2.使用checkCallingOrSelfPermission。看源码就知道,checkCallingOrSelfPermission和checkSelfPermission差别就在于参数列表:
image.png
可以看出,前者使用当前应用的进程和线程:Process.myPid(), Process.myUid()
后者使用Binder.getCallingPid(),Binder.getCallingUid(),即多进程通信中的信息,从注释中也包括一些高级的系统服务:
image.png
所以,使用checkCallingOrSelfPermission做权限检查更合适。