Я пытаюсь следовать логике в коде Android здесь , который объясняет, как выполнить намерение «Получить изображение с камеры».Я надеюсь, что один из вас, умных людей из SO, сможет помочь мне понять, ПОЧЕМУ Google разработал намерение таким образом.Сначала функция, которая запускает Intent:
val REQUEST_TAKE_PHOTO = 1
private fun dispatchTakePictureIntent() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
// Ensure that there's a camera activity to handle the intent
takePictureIntent.resolveActivity(packageManager)?.also {
// Create the File where the photo should go
val photoFile: File? = try {
createImageFile()
} catch (ex: IOException) {
// Error occurred while creating the File
...
null
}
// Continue only if the File was successfully created
photoFile?.also {
val photoURI: Uri = FileProvider.getUriForFile(
this,
"com.example.android.fileprovider",
it
)
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO)
}
}
}
}
Обратите внимание, что этот код ссылается на другую функцию, которая создает файл и имя файла:
var currentPhotoPath: String
@Throws(IOException::class)
private fun createImageFile(): File {
// Create an image file name
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
val storageDir: File = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return File.createTempFile(
"JPEG_${timeStamp}_", /* prefix */
".jpg", /* suffix */
storageDir /* directory */
).apply {
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = absolutePath
}
}
Наконец, если у вас есть намерениеи разработал для Android, прежде чем вы знаете, что вам нужна функция OnActivityResult, поэтому вот одна из них:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
val imageBitmap = data.extras.get("data") as Bitmap
imageView.setImageBitmap(imageBitmap)
}
}
Так что, если вы запустите этот код, он потерпит неудачу, что является источником моего вопроса, и я надеюсь, что кто-то,возможно, кто-то из команды разработчиков Android может объяснить мне, почему это популярное намерение возвращает нулевые данные.
Очевидный логический ход для этого следующий:
- Запустите намерение ACTION_IMAGE_CAPTURE
- Создайте файл для сохранения изображения в
- Сохраните URI этого файла в свою собственную переменную, потому что он понадобится вам позже
- Добавьте имя файла в качестве дополнительного кintent
- Начать намерение
- Интеллектуальный обратный вызов OnActivityResult возвращает, но с ним передаются данные NULL.
- Помните, что URI, который вы сохранили из eaпросто используйте это как свои возвращаемые данные.
Просто кажется странным, что данные обратного вызова являются нулевыми, и я нашел это действительно запутанным.Есть ли другое намерение, которое я должен использовать?Почему намерение не возвращает мне некоторые полезные данные, такие как URI для только что созданного файла?