Android В: Намерение (MediaStore.ACTION_IMAGE_CAPTURE) - не найдено действий для обработки Намерения - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь сделать снимок с камеры в проекте, который нацелен на Android В. Из того, что я нашел, я реализовал это:

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)

createImageFile:

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 Samsung Galaxy S8 (Боже, я ненавижу Самсунгов, это всегда особый случай для тех). Что я тут не так делаю?

1 Ответ

1 голос
/ 18 апреля 2020

Тип MIME для Intent является частью критерия для определения того, какие действия имеют <intent-filter>, который соответствует Intent. Добавление типа MIME в Intent, где этот тип MIME является неожиданным, приведет к таким проблемам, как вы.

Документация ACTION_IMAGE_CAPTURE ничего не говорит о предоставлении типа MIME по запросу. В результате приложения камеры со структурами ACTION_IMAGE_CAPTURE <intent-filter> не будут рекламировать, что они поддерживают какие-либо конкретные типы MIME. И, как результат, когда Android пытается найти подходящее действие для вашего Intent, оно появляется пустым.

Итак, удалите тип MIME, чтобы очистить ActivityNotFoundException.

...