Получение видео (не локальных) из приложения Google Photos
В приложении Google Фото я пытаюсь выбрать видео, которое не кэшируется на устройстве.
Я использую намерение ACTION_GET_CONTENT, чтобы открыть диалоговое окно параметров, и оттуда я выбираю приложение Google Photos.
При выборе локальных видео в этом виде возвращается Uri.
Содержание:// СМИ / внешние / видео / СМИ /6708
И после этого я запрашиваю контент-провайдера, чтобы узнать фактическое местоположение файла, и продолжаю оттуда. Расположение файла выглядит следующим образом.
/ storage / emulated / 0 / WhatsApp / Медиа /WhatsApp Video/VID-20131102-WA0000.mp4
Теперь, когда я выбираю онлайн-видео, т.е. видео, которое еще не доступно на моем устройстве и которое необходимо загрузить, чтобы использовать его, возвращаемый Uri выглядит следующим образом:
содержание://com.google.android.apps.photos.content/1/ https://lh6.googleusercontent.com/_RD-QTO_SK5jlaPldTe2n5GANqMc3h-ukcbNoFlF1NLy=s0-d
Теперь, с этим, нет задокументированного ContentProvider, который помог бы мне получить фактическую ссылку на это видео. Даже если я делаю запрос, он ничего не возвращает, кроме столбцов DISPLAY_NAME и SIZE.
DISPLAY_NAME содержит video.mpeg (одинаковое отображаемое имя для разных видео)
РАЗМЕР, вероятно, говорит мне размер фактического файла.
Я проверил различные записи и подумал, что мне нужно будет получить InputStream для видео через контент-провайдера, сохранить файл и работать с ним. Выбор файла изображения, однако, работает нормально, а с видео - нет.
Итак, чтобы скопировать поток в файл, у меня есть этот код.
InputStream inputStream = context.getContentResolver (). OpenInputStream(Uri.parse(path));
И, наконец, запись во временный файл. Файл создается, но, похоже, он неправильно отформатирован. VLC воспроизводит файл, но показывает только первый кадр.
Если я возьму URL из последней части URI, указанной выше, и попытаюсь просмотреть его в браузере, он загрузит файл GIF. Я предполагаю, что это проблема. Но я не знаю, как получить видео в формате mpeg.
Кто-нибудь испытывал то же самое?
1 ответ
Наконец-то нашел решение проблемы. Это будет работать как для изображений, так и для видео.
Ссылался на это видео:
DevBytes: платформа доступа к хранилищу Android 4.4: клиент
https://www.youtube.com/watch?v=UFj9AEz0DHQ
Намерение намерения = новое намерение (Intent.ACTION_GET_CONTENT); intent.setType("изображение /*"); startActivity(намерение);
Получите Uri, получите доступ и сохраните файл следующим образом:
ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver ().openFileDescriptor (Uri.parse (путь),"г"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor (); InputStream inputStream = new FileInputStream (fileDescriptor); BufferedInputStream reader = new BufferedInputStream (inputStream); // Создать выходной поток в файл, который вы хотите сохранить BufferedOutputStream outStream = new BufferedOutputStream(новый FileOutputStream(filePath)); byte[] buf = новый байт [2048]; int len; while ((len = reader.read(buf)) > 0) { outStream.write(buf, 0, len); }
По некоторым причинам получение входного потока без использования ParcelFileDescriptor не работает.