Does anyone know why I cannot move my photo? Saving the photo to the selected folder works fine with MediaStore.Images.Media.RELATIVE_PATH, but how can I do it below API 29?
My code:
private fun takePhoto() {
val name = SimpleDateFormat(FILENAME, Locale.US).format(System.currentTimeMillis())
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, name)
put(MediaStore.MediaColumns.MIME_TYPE, PHOTO_TYPE)
// MediaStore.Images.Media.RELATIVE_PATH requires API level 29+
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
put(MediaStore.Images.Media.RELATIVE_PATH, "$appPicturesPath/$albumName")
}
}
val outputOptions = ImageCapture.OutputFileOptions.Builder(
requireContext().contentResolver,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues
).build()
cameraController.takePicture(outputOptions,
cameraExecutor,
object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
val albumFolder = File(
Environment.getExternalStorageDirectory(), "$appPicturesPath/$albumName"
)
if (!albumFolder.exists()) {
albumFolder.mkdirs() //works
}
val photo = File(Environment.getExternalStorageDirectory(), name)
val saved = photo.renameTo(File(albumFolder, name))
Log.d(TAG, "saved: $saved") // FALSE
}
val savedUri = output.savedUri
Log.d(TAG, "Photo capture succeeded: $savedUri")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
@Suppress("DEPRECATION") requireActivity().sendBroadcast(
Intent(android.hardware.Camera.ACTION_NEW_PICTURE, savedUri)
)
}
lifecycleScope.launch(Dispatchers.Main) {
val action = CameraFragmentDirections.toPhotoFragment(output.savedUri.toString())
findNavController().safeNavigate(action)
}
}
})
}
I tried to move the photo using File.renameTo, but it always returns false.
My permissions:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />