将图像返回到 IMAGE_CAPTURE_INTENT

Posted

技术标签:

【中文标题】将图像返回到 IMAGE_CAPTURE_INTENT【英文标题】:Returning an image to IMAGE_CAPTURE_INTENT 【发布时间】:2021-06-20 00:10:33 【问题描述】:

我正在开发一个相机应用程序,并希望实现允许应用程序将图像返回到另一个名为 IMAGE_CAPTURE_INTENT 的应用程序的功能。

val pictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)

我在互联网上找到了很多关于如何请求另一个相机应用程序捕获图像并将其返回的信息,但我没有找到任何关于如何反过来处理它的信息,例如案例我的应用程序需要接受意图并将图像返回给另一个应用程序。我希望这是有道理的。

非常感谢任何帮助。

【问题讨论】:

“我没有找到任何关于如何反过来处理它的信息”——这将是相反的方法。如果ACTION_IMAGE_CAPTURE Intent 包含EXTRA_OUTPUT,那应该是一个Uri,你可以用它来写出照片。如果没有EXTRA_OUTPUT,则与setResult() 一起使用的Intent 应在_data 额外中包含缩略图大小的Bitmap。有一堆开源相机应用程序;您可以查看他们如何处理这些案件。 【参考方案1】:

经过研究和实验,我已经部分解决了这个问题。如果我理解正确,IMAGE_CAPTURE_INTENT 有两种工作方式: 如果 ACTION_IMAGE_CAPTURE Intent 包含 EXTRA_OUTPUT,这是一个 Uri,您可以使用此 Uri 保存拍摄的图像以返回图像。如果没有 EXTRA_OUTPUT,则与 setResult() 一起使用的 Intent 应在 _data extra 中包含缩略图大小的位图。 (感谢@CommonsWare 提供的信息!)我只使用 Uri 实现了第一个选项,因为我仍然不确定如何使用缩略图(无论如何,大多数应用程序都提供了 Uri 的意图)。

我返回图像的方法(仅使用 Uri):

    检测活动是否因意图而启动。最好在 onResume 中添加以下代码,以便每次打开应用时代码都会检查意图:
//check if activity was opened due to an intent
val isImageCaptureIntent = this.intent.action == MediaStore.ACTION_IMAGE_CAPTURE           
if(isImageCaptureIntent) 
  //retrieve the uri
  val output = intent.extras?.get(MediaStore.EXTRA_OUTPUT)

  //check if it is an Uri and not null
  if (output != null && output is Uri) 
     val uriImageCaptureIntent = output
     isImageCaptureIntentWithUri = true
     //an Uri is provided
     else
     isImageCaptureIntentWithUri = false
     //an Uri is not provided, return a thumbnail-sized bitmap. 
     //I have not included a solution for this case!
     
  
    拍照后,保存图片:
val imageOutStream: OutputStream
val contentResolver = context.contentResolver
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 
   //use this approach to save the image with android 10+ due to    scoped storage

   val mimeType =  "image/jpeg"
   val values = ContentValues().apply 
     put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
     put(MediaStore.Images.Media.MIME_TYPE, mimeType)
     put(MediaStore.Images.Media.RELATIVE_PATH, directory)
   

   contentResolver.run 
     imageOutStream = openOutputStream(uriImageCaptureIntent) ?:     return
   
else
   //use this code for Android 9 and below
   imageOutStream = context.contentResolver.openOutputStream(uriImageCaptureIntent)!!


try 
    //bitmap equals the captured image
    bitmap.compress(Bitmap.CompressFormat.JPEG, photoCompression, imageOutStream)
    imageOutStream.flush()
 catch (e: java.lang.Exception) 
    e.printStackTrace()
 finally 
    imageOutStream.close()

    图片保存后,设置结果为OK并关闭应用:
 requireActivity().setResult(Activity.RESULT_OK, requireActivity().intent)
 requireActivity().finish()

更新:从 Android 11 开始,Android 将不再允许任何第三方应用通过 IMAGE_CAPTURE_INTENT 捕获图像。虽然上面的代码应该适用于Android 10及以下,但是启动表格Android 11,在选择应用程序以执行捕获意图时,没有第三方应用程序将显示在相机选择界面中。

【讨论】:

以上是关于将图像返回到 IMAGE_CAPTURE_INTENT的主要内容,如果未能解决你的问题,请参考以下文章

将图像返回到 IMAGE_CAPTURE_INTENT

将图像从 python 传输到 C++ 并返回

将图像上传到服务器不会返回任何数据

如何将多个图像上传到 Firebase 存储并返回多个下载 URL

将位图保存到文件中并返回具有位图图像的文件

Simogeo 文件管理器未将图像 url 返回到 ckeditor