将图像返回到 IMAGE_CAPTURE_INTENT
Returning an image to IMAGE_CAPTURE_INTENT
我正在开发一个相机应用程序,并希望实现允许该应用程序将图像 return 发送到另一个名为 IMAGE_CAPTURE_INTENT 的应用程序的功能。
val pictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
我在互联网上找到了很多关于如何请求另一个相机应用程序拍摄图像并return它的信息,但我没有找到任何关于如何以其他方式处理它的信息回合,就像我的应用程序需要接受意图和 return 图像到另一个应用程序的情况一样。我希望这是有道理的。
非常感谢任何帮助。
经过研究和试验,我已经部分解决了问题。如果我理解正确的话,IMAGE_CAPTURE_INTENT 有两种工作方式:
如果ACTION_IMAGE_CAPTURE Intent中包含EXTRA_OUTPUT,也就是一个Uri,你可以将使用这个Uri拍摄的图片保存为return一张图片。如果没有 EXTRA_OUTPUT,用于 setResult() 的 Intent 应该在 _data extra 中包含缩略图大小的位图。 (感谢@CommonsWare 提供的信息!)我只用 Uri 实现了第一个选项,因为我仍然不确定如何用缩略图实现它(大多数应用程序都提供了一个带有他们意图的 Uri)。
我对 return 图片(仅使用 Uri)采取的方法:
- 检测 activity 是否因意图而启动。最好在 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()
}
- 存储图像后,将结果设置为确定并关闭应用程序:
requireActivity().setResult(Activity.RESULT_OK, requireActivity().intent)
requireActivity().finish()
更新:从Android11开始,Android将不再允许任何第三方应用程序通过IMAGE_CAPTURE_INTENT捕获图像.虽然上述代码应适用于Android 10及以下,但启动表Android 11,在选择一个应用程序以执行捕获意图时,在摄像机选择接口中不会显示第三方应用程序。
我正在开发一个相机应用程序,并希望实现允许该应用程序将图像 return 发送到另一个名为 IMAGE_CAPTURE_INTENT 的应用程序的功能。
val pictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
我在互联网上找到了很多关于如何请求另一个相机应用程序拍摄图像并return它的信息,但我没有找到任何关于如何以其他方式处理它的信息回合,就像我的应用程序需要接受意图和 return 图像到另一个应用程序的情况一样。我希望这是有道理的。
非常感谢任何帮助。
经过研究和试验,我已经部分解决了问题。如果我理解正确的话,IMAGE_CAPTURE_INTENT 有两种工作方式: 如果ACTION_IMAGE_CAPTURE Intent中包含EXTRA_OUTPUT,也就是一个Uri,你可以将使用这个Uri拍摄的图片保存为return一张图片。如果没有 EXTRA_OUTPUT,用于 setResult() 的 Intent 应该在 _data extra 中包含缩略图大小的位图。 (感谢@CommonsWare 提供的信息!)我只用 Uri 实现了第一个选项,因为我仍然不确定如何用缩略图实现它(大多数应用程序都提供了一个带有他们意图的 Uri)。
我对 return 图片(仅使用 Uri)采取的方法:
- 检测 activity 是否因意图而启动。最好在 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()
}
- 存储图像后,将结果设置为确定并关闭应用程序:
requireActivity().setResult(Activity.RESULT_OK, requireActivity().intent)
requireActivity().finish()
更新:从Android11开始,Android将不再允许任何第三方应用程序通过IMAGE_CAPTURE_INTENT捕获图像.虽然上述代码应适用于Android 10及以下,但启动表Android 11,在选择一个应用程序以执行捕获意图时,在摄像机选择接口中不会显示第三方应用程序。