如何捕捉照片并获取图像和缩略图?

时间:2018-02-15 12:48:11

标签: android android-camera-intent

我无法相信我已经挣扎了这个简单的问题好几个小时了,但我无法让它正常运行。原则上我想要这个功能:

用户点击按钮。触发ACTION_IMAGE_CAPTURE意图并打开默认相机应用。用户拍摄照片并返回我的应用程序。我的应用显示缩略图。单击缩略图将打开图像查看器。

其实很简单。在本指南中,似乎是复制和粘贴的问题:https://developer.android.com/training/camera/photobasics.html。但是魔鬼在细节中。

目前,它确实有效,但性能非常糟糕,因为我在动态创建缩略图(在我的实际应用中,我为RecyclerView中的每个条目显示多个缩略图)。我希望在搜索数十个Stack Overlow问题时,我忽略了一个简单的方法。

理想情况下,我想解雇我的ACTION_IMAGE_CAPTURE意图,让默认的相机应用程序生成缩略图,将缩略图和图像存储在系统的内容提供商中以获取缩略图和图像,最后得到相应的内容:// URI返回onActivityResult()这样会很好......

现在,我面临的问题是:

  • 我在getData()中对结果意图调用onActivityResult()时收到的URI始终为null,无论我是否提供MediaStore.EXTRA_OUTPUT值以及调用意图
  • 当省略MediaStore.EXTRA_OUTPUT额外时,我会以位图的形式获取缩略图,而不是内容:// URI。因此,如果我不想在下次开始活动时生成缩略图,我必须自己保留缩略图。
  • 我不明白为什么如果我将照片传递给内容:// URI以保存图像,我就不会获得缩略图。我的意思是,相机将图像加载到内存中,可以轻松生成缩略图。但相反,我必须再次从磁盘加载多个MB才能生成缩略图。即使我保存缩略图以供进一步使用,这似乎也是一个巨大的浪费。
  • 我已经读过一些相机应用实际上确实在任何情况下创建缩略图并使其可用于图库或其他东西。但它似乎没有标准化。

所以,我想我的愿望有两个内容:// URI根本不是它的工作原理。但在我继续生成(最终复制)缩略图之前,我会坚持并将其缓存在我的应用中,我想问:

有一些我不知道的简单方法吗?是否可以检索图像和缩略图,或者我是否必须自己生成缩略图?

注意:我想通过让Android将其添加到媒体数据库,将我的应用拍摄的照片提供给图库。我无法想象访问该媒体数据库的每个应用程序(如图库)都会创建自己的缩略图集,对吧?

提前致谢!

2 个答案:

答案 0 :(得分:1)

  

我在onActivityResult()中对结果意图调用getData()时收到的URI总是为null,无论我是否给出MediaStore.EXTRA_OUTPUT值以及调用意图

Uri没有返回ACTION_IMAGE_CAPTURE。如果你提供EXTRA_OUTPUT,你知道图像应该驻留在哪里,所以去那里寻找它。

  

当省略MediaStore.EXTRA_OUTPUT时,我会以位图的形式获取缩略图,而不是内容:// URI。

正确。

  

如果我通过相机传送content:// URI来保存图片,我不明白为什么我没有获得缩略图。

这不是ACTION_IMAGE_CAPTURE协议documented的方式。您可以将完整尺寸的照片写入EXTRA_OUTPUT,或者通过"data"附加内容获得缩略图,而不是两者。

  

我的意思是,相机将图像加载到内存中,可以轻松生成缩略图。

没有单一的相机"。有数百个相机应用程序 - 包括预安装和用户安装 - 可能会响应您的ACTION_IMAGE_CAPTURE请求,跨越10,000个设备型号和约20亿台设备。

  

是否可以同时检索图像和缩略图

不是通过ACTION_IMAGE_CAPTURE

  

我是否必须自己生成缩略图?

或许可以向MediaStore询问缩略图。我没有尝试从MediaStore检索图像,但是AFAIK会准备索引图像的缩略图。但请注意,您的索引请求(例如MediaScannerConnection.scanFile())是异步的。您可能需要自行临时管理在此应用运行期间捕获的图像的缩略图,依赖于MediaStore所有其他图像。

  

我无法想象访问该媒体数据库的每个应用程序(如图库)都会创建自己的缩略图集

我会想象许多应用会请求全尺寸图像并让他们的图像加载库(Glide,Picasso等)将图像缩放到所需的大小。

  

谁想要拍照才能获得缩略图?

ACTION_IMAGE_CAPTURE协议已经存在了十年。在2008年,移动设备的一切都很昂贵:CPU,内存和带宽。即使在2018年,在世界许多地方,相对于收入水平,其中一些东西价格昂贵。仅仅因为想要全尺寸和缩略图并不意味着每个人都这样做。

答案 1 :(得分:0)

您可以从实际图片中生成缩略图,如下所示:

final int thumbSize = 64;

Bitmap thumbBitmap= ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(actualImagePath), 
                    thumbSize, thumbSize);