Если вам нужно ваше изображение в лучшем качестве, вам нужно сохранить его в файл, в противном случае вы можете просто получить доступ к миниатюре (изображение в низком разрешении). Я поделюсь, как я это сделал.
Внутри вашего манифеста вам нужно определить провайдера файлов внутри тега приложения, также права доступа.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application...>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="{your package name}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_path" />
</provider>
</application>
Вам также нужно сделать FileProvider вваша папка res / xml. Моя выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="/storage/emulated/0/Pictures/" path="Pictures/"/>
</paths>
Пожалуйста, проведите дополнительные исследования, где вы хотите сохранить свои фотографии, в моем примере вы можете сохранить их только на SD-карту, но есть больше вариантов.
Теперь, сделав фотографию и сохранив ее.
private var currentPhotoUri = Uri.EMPTY
private var currentPhotoPath
private val requestCode = 123
private fun dispatchTakePictureIntent() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
// Ensure that there's a camera activity to handle the intent
takePictureIntent.resolveActivity(activity?.packageManager!!)?.also {
createFile()
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, currentFileUri)
startActivityForResult(takePictureIntent, requestCode)
}
}
}
private fun createFile(): File? {
val photoFile: File? = try {
createImageFile()
} catch (ex: IOException) {
Log.i("mylog error", "Error creating file: " + ex.toString())
ex.printStackTrace()
null
}
// Continue only if the File was successfully created
photoFile?.also {
val photoURI: Uri = context?.let { context ->
FileProvider.getUriForFile(
context,
"{your package name}.fileprovider",
it
)
} as Uri
currentPhotoUri = photoURI
}
return photoFile
}
private fun createImageFile(): File {
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
val storageDir: File? = context!!.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
Log.i("mylog", "storage dir = " + storageDir?.absolutePath)
return File.createTempFile(
"JPEG_${timeStamp}_", /* prefix */
".jpg", /* suffix */
storageDir /* directory */
).apply {
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = absolutePath
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent)
{
if (requestCode == requestCode && resultCode == RESULT_OK) {
val bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),currentPhotoUri)
val imageView = findViewById(R.id.Image)
imageView.setImageBitmap(bitmap)
}
}
Это должно сработать. Не забудьте проверить разрешения. Вы можете узнать больше здесь .