Android 问:Intent(MediaStore.ACTION_IMAGE_CAPTURE) - 未找到 Activity 处理 Intent
Android Q: Intent(MediaStore.ACTION_IMAGE_CAPTURE) - No Activity found to handle Intent
我正在尝试在针对 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()
returns null
Samsung Galaxy S8(上帝,我讨厌三星,它总是一些特殊情况)。
我在这里做错了什么?
Intent
上的 MIME 类型构成了确定哪些活动具有与 Intent
匹配的 <intent-filter>
的标准的一部分。在 Intent
上添加 MIME 类型,其中 MIME 类型是意外的,将导致如您所见的问题。
The ACTION_IMAGE_CAPTURE
documentation 没有说明在请求中提供 MIME 类型。因此,具有 ACTION_IMAGE_CAPTURE
<intent-filter>
结构的相机应用不会宣传它们支持任何特定的 MIME 类型。因此,当 Android 尝试为您的 Intent
寻找匹配的 activity 时,结果是空的。
因此,删除 MIME 类型以清除 ActivityNotFoundException
。
我正在尝试在针对 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()
returns null
Samsung Galaxy S8(上帝,我讨厌三星,它总是一些特殊情况)。
我在这里做错了什么?
Intent
上的 MIME 类型构成了确定哪些活动具有与 Intent
匹配的 <intent-filter>
的标准的一部分。在 Intent
上添加 MIME 类型,其中 MIME 类型是意外的,将导致如您所见的问题。
The ACTION_IMAGE_CAPTURE
documentation 没有说明在请求中提供 MIME 类型。因此,具有 ACTION_IMAGE_CAPTURE
<intent-filter>
结构的相机应用不会宣传它们支持任何特定的 MIME 类型。因此,当 Android 尝试为您的 Intent
寻找匹配的 activity 时,结果是空的。
因此,删除 MIME 类型以清除 ActivityNotFoundException
。