现在的主流手机的Android版本都是8.0/9.0(笔者的华为手机为9.0),所以在开发Android的时候尽量使用Android8.0的版本(SDK 26)。随着Android版本的提升,系统的安全性得到了加强,但是同时增加了开发的难度。Android6.0以上请求应用权限就是一个例子。
笔者以获取读取外部储存为例,实现从系统相册获取图片的功能。在调用系统相册API的时候不需要读取外部储存的权限,但是将从系统相册获取的图片显示时需要。
我在实现调用系统相册时,使用了Android 调用系统相册选择图片并显示中的代码,在此感谢该博客作者。
经过简单的CTRL+C、CTRL+V后,我成功运行了代码,并且成功的调用了系统相册。
但是在选择图片并点击“✓”后,主屏幕没有出现任何变化,并没有像想象中的出现选择的图片。
然后我注意到该博客的作者在代码中备注了要加上这样一个获取权限的代码:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
目的:获取外部储存的读取权限。
增加方法:在AndroidManifest.xml中的下图所示位置增加
但是即便这样,也无法将从相册获取的图片显示。在调试时,发现选择图片并点击“✓”后报出了这样的错误:
这里的错误信息说明找不到该图片,但是后面的“/storage/...”中正是该图片的路径。这告诉我问题不是出在相册上(相册能正确的获取图片的路径),而是出在应用的权限上。
解决问题的过程:
这时我回想起来一个我们用Android手机时经常遇到的情况。每当下载一个新的app时,它会在你安装的时候请求权限,但是你是否对下面的图片有印象:
既然能在安装时请求权限,那为什么还要在运行程序时请求一遍呢。而且很多应用在你拒绝某些权限后会直接闪退。
通过查找资料,我终于在博客一行代码搞定Android 6.0动态权限申请中找到了原因