Как получить путь к одному видео, которое я выбрал Intent в Android Studio, используя его Uri?

Я хочу использовать путь для копирования этого видео в другой каталог, но ошибка, которая выдает меня, говорит, что мой URI или путь не существует.

   probar.setOnClickListener({
        val selectedImageUri2=globalVariable.video//here I just saved the uri path of the intent
        if(!CheckPermissionFromDevice()){
            requestPermission()
        } else {
            val sourcePath = Environment.getExternalStorageDirectory().absolutePath +"/"+ selectedImageUri2.toString()
            Toast.makeText(this, "SOURCE PATH:: "+sourcePath, Toast.LENGTH_SHORT).show()
            println("SOURCE"+sourcePath)
            val source= File(sourcePath)
            val destinationPath = Environment.getExternalStorageDirectory().absolutePath + "/AudioFiscalia/"
            val destination = File(destinationPath)
            try {
                FileUtils.copyFile(source, destination)
                Toast.makeText(applicationContext, "TRY BIEN", Toast.LENGTH_LONG).show()
            } catch (e: IOException) {
                e.printStackTrace()
                Toast.makeText(applicationContext, "CATCH"+e.toString(), Toast.LENGTH_LONG).show()
                println("error"+e.toString())
            }
        }
    })

Это моя ошибка: Источник '/storage/emulated/0/content:/com.android.externalstorage.documents/document/primary%3ADCIM%2FHDCamera%2FVID_20190903_114707.mp4' не существует


person Emmanuel    schedule 03.09.2019    source источник


Ответы (1)


Как получить путь к одному видео, которое я выбрал Intent в Android Studio, используя его Uri?

Вы не знаете.

Пользователю не нужно выбирать файл в файловой системе. Пользователь мог выбрать контент в облачном хранилище, на файловом сервере и т.д.

Даже если пользователь решит выбрать какой-либо локальный контент, у вас может не быть к нему доступа. На Android 10+ у вас очень мало доступа к файловой системе. И даже на Android 9 и более старых устройствах пользователь мог выбрать:

  • Локальный файл во внутренней памяти для другого приложения
  • Локальный файл на съемном носителе
  • Локальный файл, который зашифрован и должен быть расшифрован на лету
  • Поток байтов, хранящихся в столбце BLOB в базе данных.
  • Часть контента, которую необходимо сначала загрузить другим приложением.
  • ...и так далее

У вас нет доступа ни к чему из этого через файловую систему.

Я хочу использовать путь для копирования этого видео в другой каталог

Желательно этого не делать. Помимо ваших проблем с исходным местоположением, пункт назначения недоступен для вас на Android 10.

Если вы переключите пункт назначения на место, которое вы можете использовать, вы можете получить InputStream для источника, вызвав openInputStream() для ContentResolver, передав полученное Uri.

person CommonsWare    schedule 03.09.2019
comment
Большое спасибо за объяснение, мне действительно нужно было это разъяснение. В случае, если мне нужно изменить местоположение моих видео... Как я могу использовать InputStream? Я надеюсь, что вы можете мне помочь. - person Emmanuel; 04.09.2019
comment
@Emmanuel: Как я могу использовать InputStream? -- прочитать байты из InputStream и записать их в какой-нибудь OutputStream, например. - person CommonsWare; 04.09.2019
comment
/storage/emulated/0/VID_20190903_114707.mp4: ошибка открытия: ENOENT (Нет такого файла или каталога) выдает эту ошибку. Больше того же (спасибо за ответ) - person Emmanuel; 04.09.2019
comment
@Emmanuel: Возможно, у вас нет разрешения READ_EXTERNAL_STORAGE (в манифесте и запрошенном во время выполнения). Или, возможно, этот файл не существует. И, как я уже отмечал, у вас все равно нет доступа к этому местоположению на Android 10+. - person CommonsWare; 05.09.2019