Android - публиковать / тестировать apk с файлами расширения - как это работает?
Я все еще учусь на Android, и у меня есть приложение, которое имеет более 100 МБ, и поэтому мне нужно использовать файлы расширения.
Я прочитал тысячи документов, но я очень смущен.
Есть много mp3-файлов, которые мне нужно сжать в такого рода "файле расширения", чтобы загружать только apk-код, а не весь app + mp3-файлы.
Я думаю, что если я сгенерирую файл ".obb" со всеми этими mp3-файлами, я получу более 50 МБ, по запросу Google Play.
Я знаю, что этот файл '.obb' должен находиться в папке scard/Android/obb моего устройства.
В настоящее время мой код получает ресурс 'int' из mp3-файла, чтобы управлять им следующим образом:
intMyResource=R.raw.name_of_my_music_file;
Но в настоящее время, как я уже сказал, путь к файлам - "R.raw".
Мой вопрос: как лучше всего заменить метод?
intMyResource=R.raw.name_of_my_music_file;
к фактическому пути / имени, где мой файл.obb?
Спасибо вам всем.
Mauro
1 ответ
Вы должны создать файл расширения с этой командой zip:
zip -r -9 -n ".mp3" main-expansion-file.zip *
Параметр -n крайне важен, чтобы не сжимать медиа-файлы, потому что если медиа-файлы сжаты, вы не сможете использовать их в своем приложении для Android. Измените имя zip на 'main.VERSIONCODE.YOURPACKAGENAME.obb и скопируйте этот файл.obb в папку scard/Android/obb на устройстве.
Чтение файлов из zip-файлов расширения - это простая работа с библиотекой Google ZipFile (доступна в pathAndroidSDK/extras/google/play_apk_expansion/zip_file)
Замените R.raw.name_music_file вызовом этого метода:
public static AssetFileDescriptor getFileDescriptor(Context ctx, String path) {
AssetFileDescriptor descriptor = null;
try {
ZipResourceFile zip = APKExpansionSupport.getAPKExpansionZipFile(ctx, 1, -1);
descriptor = zip.getAssetFileDescriptor(path);
} catch (IOException e) {
Log.e("APKExpansionSupport", "ERROR: " + e.getMessage(), e);
e.printStackTrace();
}
return descriptor;
}
Пример кода для воспроизведения музыки из файла расширения с MediaPlayer:
AssetFileDescriptor descriptor = null;
try {
descriptor = getFileDescriptor(this, "name_music_file.mp3"));
MediaPlayer reproductor = new MediaPlayer();
reproductor.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
reproductor.setOnCompletionListener(this);
reproductor.prepare();
reproductor.start();
} catch (Exception e) {
Log.e("Play mp3", "ERROR: " + e.getMessage(), e);
} finally {
if (descriptor != null)
try{descriptor.close();} catch (IOException e) {}
}
Надеюсь, это поможет вам!