【问题标题】:Android Q: Intent(MediaStore.ACTION_IMAGE_CAPTURE) - No Activity found to handle IntentAndroid Q: Intent(MediaStore.ACTION_IMAGE_CAPTURE) - 找不到处理 Intent 的 Activity
【发布时间】:2024-01-01 20:01:01
【问题描述】:

我正在尝试在一个针对 Android Q 的项目中实现从相机拍摄照片。 根据我的发现,我已经实现了这个:

val mediaFile = mediaManager.createImageFile() // creates a file to store the image and returns Uri
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
intent.apply {
  addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
  type = MIME_TYPE_IMAGE //"image/*"
  intent.putExtra(MediaStore.EXTRA_OUTPUT, mediaFile)
}
startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO)

创建图像文件:

override fun createImageFile(): Uri? {
    return createFile(mimeType = MIME_IMAGE_JPG, isImage = true)
}

private fun createFile(mimeType: String, isImage: Boolean): Uri? {
val mediaFileName = createTempName()

val path = if (isImage) {
  Environment.DIRECTORY_PICTURES
} else {
  Environment.DIRECTORY_MOVIES
}

val contentValues = ContentValues().apply {
  put(MediaStore.MediaColumns.DISPLAY_NAME, mediaFileName)
  put(MediaStore.MediaColumns.MIME_TYPE, mimeType)
  put(MediaStore.MediaColumns.RELATIVE_PATH, path)
}
val resolver = context.contentResolver
val contentUri = if (isImage) {
  MediaStore.Images.Media.EXTERNAL_CONTENT_URI
} else {
  MediaStore.Video.Media.EXTERNAL_CONTENT_URI
}
return resolver.insert(contentUri, contentValues)
}

但是,我得到android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.media.action.IMAGE_CAPTURE typ=image/* flg=0x3 clip={text/uri-list U:content://media/external/images/media/109855} (has extras) }

我搜索了几个小时并按照说明做了所有事情,但仍然没有运气。 有趣的是,createImageFile() 返回null 三星 Galaxy S8(天哪,我讨厌三星,这总是一些特殊情况)。 我在这里做错了什么?

【问题讨论】:

  • 看看here.你会发现如何解决这个问题。
  • @gcantoni 感谢您的回复,但该解决方案使用了在 Android Q 上已弃用的Environment.getExternalStorageDirectory()
  • Deprecated 不是垃圾的同义词,它始终是工作代码!试试看???
  • 首先,删除type = MIME_TYPE_IMAGE。不要在 ACTION_IMAGE_CAPTURE 请求中提供 MIME 类型。其次,去掉RELATIVE_PATH,因为你使用它的方式是不必要的。
  • @CommonsWare 很好,这行得通。设置 MIME 类型是问题所在。非常感谢!

标签: android android-intent mediastore android-image-capture


【解决方案1】:

Intent 上的 MIME 类型构成了确定哪些活动具有与Intent 匹配的<intent-filter> 的标准的一部分。在 Intent 上添加 MIME 类型,如果 MIME 类型是意外的,则会导致您看到的问题。

The ACTION_IMAGE_CAPTURE documentation 没有说明在请求中提供 MIME 类型。因此,具有ACTION_IMAGE_CAPTURE<intent-filter> 结构的相机应用程序不会宣传它们支持任何特定的 MIME 类型。因此,当 Android 尝试为您的 Intent 寻找匹配的活动时,它会空无一物。

因此,删除 MIME 类型以清除 ActivityNotFoundException

【讨论】:

    最近更新 更多