如何拍摄照片并获取图像和缩略图?
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 就好了...
现在,这是我面临的问题:
- 我在
onActivityResult()
中对结果意图调用 getData()
时收到的 URI 总是 null
无论我是否在调用意图的同时给出 MediaStore.EXTRA_OUTPUT
值
- 当省略额外的
MediaStore.EXTRA_OUTPUT
时,我得到的是位图形式的缩略图,而不是 content:// URI。因此,如果我不想在下次启动 activity. 时生成它,我必须自己保留缩略图
- 我不明白为什么如果我向相机传递一个 content:// URI 来保存图像,为什么我得不到缩略图。我的意思是,相机将图像加载到内存中,可以轻松生成缩略图。但是,我必须再次从磁盘加载多个 MB 才能生成缩略图。这似乎是一个巨大的浪费,即使我保存缩略图以供以后进一步使用。
- 我读到一些相机应用程序实际上确实在任何情况下都会创建缩略图并将其提供给画廊或其他东西。但是好像不规范。
所以,我想我希望两个 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 年,在世界许多地方,相对于收入水平,其中一些东西还是很昂贵的。仅仅因为 你 想要全尺寸和缩略图并不意味着每个人都想要。
我不敢相信我已经为这个简单的问题苦苦挣扎了几个小时,但我无法正确地解决它 运行。原则上我想要这个功能:
用户点击了一个按钮。 ACTION_IMAGE_CAPTURE
意图被触发,默认相机应用程序打开。用户拍照并 returns 到我的应用程序。我的应用程序显示缩略图。单击缩略图打开图像查看器。
其实很简单。有了本指南,似乎只需复制和粘贴即可:https://developer.android.com/training/camera/photobasics.html。但细节决定成败。
目前,它确实有效,但性能很糟糕,因为我即时创建了缩略图(在我实际的应用程序中,我在 RecyclerView
中为每个条目显示多个缩略图)。我希望有一个我在搜索数十个 Stack Overlow 问题时忽略的简单方法。
理想情况下,我想激发我的 ACTION_IMAGE_CAPTURE
意图,让默认相机应用程序生成缩略图,将缩略图和图像存储在系统的缩略图和图像内容提供程序中最后在 onActivityResult()
. 中获取相应的 content:// URI 就好了...
现在,这是我面临的问题:
- 我在
onActivityResult()
中对结果意图调用getData()
时收到的 URI 总是null
无论我是否在调用意图的同时给出MediaStore.EXTRA_OUTPUT
值 - 当省略额外的
MediaStore.EXTRA_OUTPUT
时,我得到的是位图形式的缩略图,而不是 content:// URI。因此,如果我不想在下次启动 activity. 时生成它,我必须自己保留缩略图
- 我不明白为什么如果我向相机传递一个 content:// URI 来保存图像,为什么我得不到缩略图。我的意思是,相机将图像加载到内存中,可以轻松生成缩略图。但是,我必须再次从磁盘加载多个 MB 才能生成缩略图。这似乎是一个巨大的浪费,即使我保存缩略图以供以后进一步使用。
- 我读到一些相机应用程序实际上确实在任何情况下都会创建缩略图并将其提供给画廊或其他东西。但是好像不规范。
所以,我想我希望两个 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 年,在世界许多地方,相对于收入水平,其中一些东西还是很昂贵的。仅仅因为 你 想要全尺寸和缩略图并不意味着每个人都想要。