实战安卓踩坑记录(六)

0.前言

跟着《第一行代码:Android》学到了8.3.2从相册中选择照片这一节的时候又遇到一个bug了,完全按照书上的代码写的时候,选择图片的时候总是闪退。

1.问题描述

大概就是这样,打开相册时候没问题,一点照片就闪退。代码完全和书上一致。
报错信息为:Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=3644, uid=10092 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

在这里插入图片描述

2.问题分析

首先先看一下代码和书上的完全一致,大概率是Android系统升级了,有些东西过时了(现在都0202年了,这本书是2016年的,前几天第三版都出来了),所以有一些东西不兼容正常。

看一下报错信息,大概意思就是少了READ_EXTERNAL_STORAGE这个权限,但在代码中,明明对这个权限进行了动态申请,代码如下:

 if (ContextCompat.checkSelfPermission(MainActivity.this,
     Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
     ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                } else {
                    openAlbum();
                }

3.解决问题方案探索

然后仔细看,看到这一句 requires android.permission.READ_EXTERNAL_STORAGEandroid.permission.READ_EXTERNAL_STORAGE感觉像是在AndroidManifest.xml中声明的权限一样。加上这一句试试

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

显示这样的结果页面
在这里插入图片描述
这就显示You denied the permission,这我就很不能理解了,需要我加上这个权限,我加上之后怎么还不行?
仔细看动态申请权限那一部分的代码,动态申请的是WRITE_EXTERNAL_STORAGE这个权限,但在AndroidManifest.xml中声明的是READ_EXTERNAL_STORAGE权限,所以当然直接显示You denied the permission了

4.解决方案

既然动态申请的是WRITE_EXTERNAL_STORAGE这个权限,那就在AndroidManifest.xml声明这个权限,而且由于都有写入的权限了也就自带有读取的权限,所以直接在AndroidManifest.xml声明

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

最后运行结果正常了。

换一个思路,如果我还是只想声明

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

因为毕竟我只是读取这个照片,对于相册不需要写入操作,那么如何办呢?可以把动态声明的权限改成READ_EXTERNAL_STORAGE即可。最后运行结果也正常了。
在这里插入图片描述

5.产生问题的原因

仔细看过了,问题不在代码,在于我,你想啊,都动态声明这个权限了,怎么能不把这个权限在AndroidManifest.xml中声明呢?但我把这一下章节的代码都对照了,根本没有在AndroidManifest.xml中声明的代码啊。
问题就出在8.3.1的最后一部分,这一部分是这样说的
在这里插入图片描述
在做8.3.1的任务时候,当时我已经把程序运行出来,而且现在基本上很少有4.4以下的手机了,也就没有声明这一句权限。后面8.3.2的任务和8.3.1是一个项目工程文件CameraAlbumTest,由此导致了在8.3.2的任务中没有声明这个权限。

6.总结

这次debug的经历,让我对Android的权限机制更加了解了,不仅体现在我解决了这个问题,更在于在我查找问题的解决方案的时候,查阅各种资料,对于权限有了更深的认识,知道了很多之前不知的事情。我觉得这才是对于我这样的初学者最大的收获。
如果我当时查阅代码之后,觉得自己写的和书上的一样,本能认为是系统兼容性的问题,直接略过,我想我绝不会有这么深刻的体会,我觉得这才是debug的最终目的——不仅解决当前问题,还能对问题有更深入的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值