Я хочу записать видео, сохранить его во внутренней памяти и получить доступ к файлу.
FileProvider создает URI для камеры, собирающейся записать видео:
File path = new File(this.getFilesDir(), "shared");
File file = new File(path, UUID.randomUUID().toString() + ".mp4");
// Store URI as property of activity
this.uri = FileProvider.getUriForFile(App.getInstance().getApplicationContext(), App.getInstance().getApplicationContext().getPackageName() + ".provider", file);
Intent videoCaptureIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
videoCaptureIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, durationLimit);
videoCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(videoCaptureIntent, REQUEST_VIDEO_CAPTURE);
Видеофайл хранится во внутреннем хранилище приложения, я вижу файл в проводнике Android в правильном месте.
Однако после этого я не могу получить доступ к файлу, файл не может быть найден. Свойство uri по-прежнему показывает правильные uriString и authority.
if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_VIDEO_CAPTURE) {
File file = new File(this.uri.getPath());
Log.d(file.exists()); // Logs false
}
Это почему?
В настоящее время приложение настроено для передачи URI. Есть ли способ получить File по URI?
кстати, для чего вам нужен объект File? просто для чтения входного потока?
@pskink Файл должен быть загружен на сервер. Метод загрузки принимает в качестве параметра File. Ваш намек мне не помог, я все еще ищу :)
используя оххтп? если да, используйте кастомный RequestBody
@pskink Нет, с помощью Parse Android SDK.
поэтому вы не можете этого сделать, поскольку невозможно получить объект File из данного Uri
Я нашел несколько хитрых способов с недоработками в зависимости от контент-провайдера. Похоже, что лучший способ - передавать объекты File вместо URI, что я и сделаю вместо этого.
да, в таком случае это был бы лучший вариант
this.uri.getPath()не возвращает то, что вы думаете. Путь URI, в широком смысле, - это часть сегментов, следующих за полномочиями (и необязательным портом). Это не путь к файлу. Почему бы просто не повеситьFile file?