Trouble Moving Photos to a Selected Folder Below API 29

25 views Asked by At

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" />
0

There are 0 answers