我无法相信我已经挣扎了这个简单的问题好几个小时了,但我无法让它正常运行。原则上我想要这个功能:
用户点击按钮。触发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根本不是它的工作原理。但在我继续生成(最终复制)缩略图之前,我会坚持并将其缓存在我的应用中,我想问:
有一些我不知道的简单方法吗?是否可以检索图像和缩略图,或者我是否必须自己生成缩略图?
注意:我想通过让Android将其添加到媒体数据库,将我的应用拍摄的照片提供给图库。我无法想象访问该媒体数据库的每个应用程序(如图库)都会创建自己的缩略图集,对吧?
提前致谢!
答案 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);