如何拍摄照片并获取图像和缩略图?

How to capture photo and get image and thumbnail?

我不敢相信我已经为这个简单的问题苦苦挣扎了几个小时,但我无法正确地解决它 运行。原则上我想要这个功能:

用户点击了一个按钮。 ACTION_IMAGE_CAPTURE 意图被触发,默认相机应用程序打开。用户拍照并 returns 到我的应用程序。我的应用程序显示缩略图。单击缩略图打开图像查看器。

其实很简单。有了本指南,似乎只需复制和粘贴即可:https://developer.android.com/training/camera/photobasics.html。但细节决定成败。

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

理想情况下,我想激发我的 ACTION_IMAGE_CAPTURE 意图,让默认相机应用程序生成缩略图,将缩略图和图像存储在系统的缩略图和图像内容提供程序中最后在 onActivityResult(). 中获取相应的 content:// URI 就好了...

现在,这是我面临的问题:

所以,我想我希望两个 content:// URI 根本不是它的工作原理。但在我继续自己生成(最终复制)缩略图并将它们保存并缓存在我的应用程序中之前,我想问:

有什么我不知道的简单方法吗?是否可以同时检索图像和缩略图,还是我必须自己生成缩略图?

注意:我想让 Android 将使用我的应用程序拍摄的照片添加到媒体数据库,从而使它们可供图库使用。我无法想象每个访问该媒体数据库(如图库)的应用程序都会创建自己的一组缩略图,对吗?

提前致谢!

您可以像这样从实际图像生成缩略图:

final int thumbSize = 64;

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

The URI I receive when invoking getData() on the resulting intent in onActivityResult() is always null whether or not I give a MediaStore.EXTRA_OUTPUT value along with the invoking intent

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

When omitting the MediaStore.EXTRA_OUTPUT extra I get the thumbnail in form of a bitmap and not as a content:// URI.

正确。

I don't understand why I don't get the thumbnail if I pass the camera a content:// URI to save the image to.

这不是 ACTION_IMAGE_CAPTURE 协议 documented 的方式。您要么将全尺寸照片写入 EXTRA_OUTPUT,要么通过 "data" extra 获得缩略图,而不是两者。

I mean, the camera has the image loaded in memory and could easily generate the thumbnail.

没有一个"the camera"。在约 10,000 种设备型号和约 20 亿种设备中,有数百种相机应用程序(包括预装和用户安装)可能会响应您的 ACTION_IMAGE_CAPTURE 请求。

Is it possible to retrieve both, image and thumbnail

不是通过 ACTION_IMAGE_CAPTURE.

do I have to generate the thumbnail myself?

或许可以向 MediaStore 索取缩略图。我没有玩过从 MediaStore 检索图像,但 AFAIK 它准备了索引图像的缩略图。但是,请记住您的索引请求(例如 MediaScannerConnection.scanFile())是异步的。您可能需要临时管理您在此 运行 应用程序期间捕获的图像的缩略图,依赖于 MediaStore 用于所有其他图像。

I can't imagine that every app that accesses that media database (like the gallery) creates it's own set of thumbnails

我想很多应用程序都会请求全尺寸图像并让它们的图像加载库(Glide、Picasso 等)将图像缩放到所需的尺寸。

Who would want to take a photo to only get the thumbnail?

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