委托相机应用拍照学习笔记
问题
在一个 Activity 中,放置一个按钮 Button 和图像视图 ImageView 组件。期望点击按钮后委托系统已经存在的相机应用拍照,完成后在 ImageView 中显示拍摄的照片,怎样实现?
回答
Android 应用开发官网的开发指南给出了两种方案,都有十分详尽的指导,本文侧重于记述个人的学习经验,不再赘述。
方案一:不给出图片的保存位置,拍照完成后将图片通过 onActivityResult() 方法的 Intent data 参数传递回来。
方案二:给出图片的保存位置,拍照完成后保存到指定位置。在 Activity 中根据图片路径获取图片(由于图片的位置是由 Activity 给拍照应用的,所以事先知道照片的路径)。
说明
- 指南中指出通过方案一获取的只是拍照后图片的缩略图,如果有剪裁之类的图片处理需求,应该采用方案二。
- 我在对照指导文档写方案二代码的时候,遇到了如下错误:
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/pers.xumeng.androidstudy/files/Pictures/JPEG_20210420_135351_5652778187316939995.jpg
res/xml/file_paths.xml 中配置的路径,初始写法如下:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="my_images"
path="Android/data/pers.xumeng.androidstudy/files/Pictures" />
</paths>
查阅资料后,了解到 external-files-path
本身就代表着 /storage/emulated/0/Android/data/<package_name>/files
路径,上面的写法,对应的实际路径为 external-files-path
代表的部分拼上 path 的部分:
/storage/emulated/0/Android/data/<package_name>/files/Android/data/pers.xumeng.androidstudy/files/Pictures
所以,Failed to find configured root that contains ... (找不到配置的包含...的根) 也就可以理解了。所以 path 的正确写法如下:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="my_images"
path="/Pictures" />
</paths>
另外,我在写这篇文章时查阅了开发指南的英文版本,结果发现英文版中path 的写法和我修改之后的类似。估计是这个文档错误在英文版中已经修正了,但是中文版还没更新吧。
![](https://img.haomeiwen.com/i17607515/e5cdc548b581b7bb.png)
![](https://img.haomeiwen.com/i17607515/e8bed0fc22dc4870.png)
附
测试设备参数
操作系统:MIUI 12.0.4 稳定版 (Android 10)