Есть ли способ получить URL-адрес для определенного файла в файле расширения Android?

Я создаю приложение PhoneGap, которое содержит большие аудио и видео файлы. В Android мультимедийные файлы должны находиться в файле расширения, чтобы размер приложения не превышал 50 МБ в Google Play.

В настоящее время я рассматриваю два способа воспроизведения видеофайлов:

  1. Распакуйте (возможно временно) нужный видеофайл из файла расширения на SDCard, получите его URL и запустите приложение медиаплеера. Распаковка занимает некоторое время, поэтому пользователю придется ждать несколько секунд, в зависимости от размера видео.
  2. Напишите мой собственный видеопроигрыватель как плагин 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-контента, вам нужно написать собственный аудио-плагин.

Другие вопросы по тегам