0

我仍然是一名 Android 学生,我已经开发了一个超过 100Mb 的应用程序,因此我需要使用扩展文件。

我已经阅读了数千份文件,但我很困惑。

我需要在那种“扩展文件”中压缩许多 mp3 文件,以便只上传 apk 代码而不是整个 app+mp3 文件。

我想如果我用所有这些 mp3 生成一个文件“.obb”,我会超过 Google Play 要求的 50MB。

我知道这个“.obb”文件也必须在我设备的 scard/Android/obb 文件夹中。

目前我的代码从 mp3 文件中获取“int”资源来操作它是这样的:

intMyResource=R.raw.name_of_my_music_file;

但是,目前,正如我所说,文件的路径是“R.raw”。

我的问题:最好的替换方法是什么

intMyResource=R.raw.name_of_my_music_file;

到我的“.obb”文件所在的实际路径/名称?

谢谢你们。

毛罗

4

1 回答 1

0

You should create expansion file with this zip command:

zip -r -9 -n ".mp3" main-expansion-file.zip *

Use -n option is critical to don't compress media files, because if media files are compressed you cannot use it in your android application. Change name zip to 'main.VERSIONCODE.YOURPACKAGENAME.obb and copy this .obb file in scard/Android/obb folder device.

Read files of zip expansion files is easy work with Google ZipFile Library (available in pathAndroidSDK/extras/google/play_apk_expansion/zip_file)

Replace R.raw.name_music_file by call of this method:

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;
    }

Example code to play music from expansion file with 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) {}
            }

Hope this help you!

于 2014-01-08T17:05:27.677 回答