安卓6.0动态申请权限遇到了一个错误

2019-01-02 23:19发布

事情是这样的,小白写了一个简单的记事本程序,就是简单的读写一下文本文件的,
但是呢在测试的时候出现了一些问题,在我的7.0的真机,以及AS8.0的模拟器上程
序都是没有问题的,甚至我拿安卓4.4的模拟器测试也是没有问题的,但是就是在6.0
的系统上怎么测试都不行,报出以下错误 Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable

通过一番盘查,虽然还是不太理解这到底应该怎么改,但是我的问题好像是出在了权限的
请求上了,因为在 targetsdkVersion22版本上的时候由于不需要请求权限,所以正常运行没有问题,而在更高的版本version的时候就会在6.0的机器上报出如上错误。

所以这个时候我就基本确定是权限的问题了,然后我把version改成23,禁用权限申请方法之后发现,程序最起码可以运行了,虽然不会写入和读取。

那么问题来了,我的权限请求代码是从网上找到的,但是我看好像都是这么写的,而且这些代码在6.0以上的机器也没有问题。代码如下:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//用户已经拒绝过一次,再次弹出权限申请对话框需要给用户一个解释
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission
.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(this, "我要写入权限,真的!", Toast.LENGTH_SHORT).show();
}
//申请权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},200);
} else {
Toast.makeText(this, "写入权限没问题,OVER!", Toast.LENGTH_SHORT).show();
}

            想请大家看看,到底是代码出现了问题,还是说6.0还有一些我所不知道的特性或者BUG?

1条回答
Bombasti
2楼-- · 2019-01-02 23:58

ContextCompat.checkSelfPermission()
被授权函数返回PERMISSION_GRANTED,否则返回PERMISSION_DENIED ,在所有版本都是如此。
ActivityCompat.requestPermissions()
这个方法在M之前版本调用,OnRequestPermissionsResultCallback 直接被调用,带着正确的 PERMISSION_GRANTED或者 PERMISSION_DENIED 。
ActivityCompat.shouldShowRequestPermissionRationale()
在M之前版本调用,永远返回false。
用v4包的这三方法,完美兼容所有版本!这个方法需要额外的参数,Context or Activity。别的就没啥特别的了。下面是代码:

作者:微凉一季
链接:https://www.jianshu.com/p/e1ab1a179fbb
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

所以问题应该出在这里,我更换成ContextCompat之后,代码就可以正常运行了

查看更多
登录 后发表回答