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

Android-发布/测试带有扩展文件的apk-它是如何工作的?,android,expansion-files,Android,Expansion Files,我还是一名Android学生,我开发了一个超过100Mb的应用程序,因此我需要使用扩展文件 我读了成千上万的文件,但我很困惑 有很多mp3文件,我需要在这种“扩展文件”中压缩,以便只上传apk代码,而不是整个应用程序+mp3文件 我想如果我生成一个文件“.obb”和所有的mp3文件,我会超过谷歌播放所需的50MB 我知道这个“.obb”文件也必须在我设备的scard/Android/obb文件夹中 目前,我的代码从mp3文件中获取“int”资源,以对其进行如下操作: intMyResource=

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

我读了成千上万的文件,但我很困惑

有很多mp3文件,我需要在这种“扩展文件”中压缩,以便只上传apk代码,而不是整个应用程序+mp3文件

我想如果我生成一个文件“.obb”和所有的mp3文件,我会超过谷歌播放所需的50MB

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

目前,我的代码从mp3文件中获取“int”资源,以对其进行如下操作:

intMyResource=R.raw.name\u我的音乐文件

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

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

intMyResource=R.raw.name\u我的音乐文件

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

谢谢大家


Mauro

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

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

使用Google ZipFile库读取zip扩展文件很容易(可在Pathandoridk/extras/Google/play_apk_expansion/zip_文件中找到)

通过调用此方法替换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) {}
            }
希望这对你有帮助