Android - 使用扩展文件发布/测试apk - 它是如何工作的?

时间:2013-11-01 15:08:02

标签: android expansion-files

我还是一名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'文件所在的实际路径/名称?

谢谢大家。

莫罗

1 个答案:

答案 0 :(得分:0)

您应该使用此zip命令创建扩展文件:

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

使用-n选项对于不压缩媒体文件至关重要,因为如果媒体文件被压缩,则无法在Android应用程序中使用它。 将名称zip更改为'main.VERSIONCODE.YOURPACKAGENAME.obb并将此.obb文件复制到scard / Android / obb文件夹设备中。

使用Google ZipFile Library轻松读取zip扩展文件的文件(在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) {}
            }

希望这对你有帮助!