Есть ли способ получить URL-адрес для определенного файла в файле расширения Android?
Я создаю приложение PhoneGap, которое содержит большие аудио и видео файлы. В Android мультимедийные файлы должны находиться в файле расширения, чтобы размер приложения не превышал 50 МБ в Google Play.
В настоящее время я рассматриваю два способа воспроизведения видеофайлов:
- Распакуйте (возможно временно) нужный видеофайл из файла расширения на SDCard, получите его URL и запустите приложение медиаплеера. Распаковка занимает некоторое время, поэтому пользователю придется ждать несколько секунд, в зависимости от размера видео.
- Напишите мой собственный видеопроигрыватель как плагин PhoneGap, используя класс VideoView для Android. Таким образом, я могу играть прямо из файла расширения без предварительной распаковки файла и получить более отзывчивое приложение.
Однако мне интересно, есть ли способ получить URL-адрес видеофайлов внутри файла расширения? Это позволило бы моему приложению добавить URL-адрес в намерение, с которого запускается приложение предпочтительного мультимедийного проигрывателя пользователя, и я бы предпочел этот подход.
1 ответ
Я нашел способ сделать это через контент-провайдера. Я получил подсказку о контент-провайдере из вопроса " Воспроизведение фильма в Android" внутри файла расширения, хотя в этом вопросе URL-адрес не использовался для запуска внешнего приложения.
Нам нужен класс Content Provider, который расширяет APEZProvider от Google:
public class ZipFileContentProvider extends APEZProvider {
@Override
public String getAuthority() {
return "com.example.expansionexperiment.provider";
}
}
И его нужно добавить в Манифест и экспортировать:
<provider
android:exported="true"
android:name="com.example.expansionexperiment.ZipFileContentProvider"
android:authorities="com.example.expansionexperiment.provider" />
Полномочия в манифесте и в getAuthority() должны быть одинаковыми.
Теперь мы можем создать Uri для файла внутри файла расширения:
// Filename inside my expansion file
String filename = "video/video.mp4";
String uriString = "content://com.example.expansionexperiment.provider" + File.separator + filename;
Uri uri = Uri.parse(uriString);
// Start video view intent
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/*");
startActivity(intent);
Поставщик контента теперь предоставляет доступ к zip-файлу и файлам только с помощью URL.
Однако плагин PhoneGap Media не поддерживает контент-провайдеров, потому что если URL не начинается с http, он вставляет "/sdcard/" перед URL. (!!!) Поэтому, чтобы воспроизводить аудиофайлы через провайдера zip-контента, вам нужно написать собственный аудио-плагин.