从扩展文件中读取mp3

时间:2012-10-23 13:13:19

标签: android file mp3 expansion

从扩展文件中读取mp3文件

我有名称为

的创建和扩展文件

“main.1.com.example.app.obb”

包含和音频文件名“about_eng.mp3”

现在问题我写了下面的代码来阅读和播放mp3文件

    private final static String EXP_PATH = "/Android/obb/";

static String[] getAPKExpansionFiles(Context ctx, int mainVersion, int patchVersion) {
    String packageName = ctx.getPackageName();
    Vector<String> ret = new Vector<String>();
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        // Build the full path to the app's expansion files
        File root = Environment.getExternalStorageDirectory();
        File expPath = new File(root.toString() + EXP_PATH + packageName);

        // Check that expansion file path exists
        if (expPath.exists()) {
            if ( mainVersion > 0 ) {
                String strMainPath = expPath + File.separator + "main." +
                        mainVersion + "." + packageName + ".obb";
                File main = new File(strMainPath);
                if ( main.isFile() ) {
                        ret.add(strMainPath);
                }
            }
            if ( patchVersion > 0 ) {
                String strPatchPath = expPath + File.separator + "patch." +
                        mainVersion + "." + packageName + ".obb";
                File main = new File(strPatchPath);
                if ( main.isFile() ) {
                        ret.add(strPatchPath);
                }
            }
        }
    }
    String[] retArray = new String[ret.size()];
    ret.toArray(retArray);
    return retArray;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    // Get a ZipResourceFile representing a merger of both the main and patch files

    try {
        ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(this,1,1);
        if(expansionFile!=null){

            AssetFileDescriptor fd = expansionFile.getAssetFileDescriptor("about_eng.mp3");
                //or
            MediaPlayer mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource( fd.getFileDescriptor(), 
                    fd.getStartOffset(),fd.getLength());
            mediaPlayer.prepare();
            mediaPlayer.start();

            }




    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // Get an input stream for a known file inside the expansion file ZIPs


}

但它总是在这一行抛出异常

 mediaPlayer.setDataSource( fd.getFileDescriptor(), 
                    fd.getStartOffset(),fd.getLength());
            mediaPlayer.prepare();

因为变量fd为null。

任何机构都可以帮我解决这个问题吗

3 个答案:

答案 0 :(得分:6)

我用Google搜索,发现我们必须在http://developer.android.com/google/play/expansion-files.html

中提及0% (No compression) .zip。

Tip: If you're packaging media files into a ZIP, you can use media playback calls on the files with offset and length controls (such as MediaPlayer.setDataSource() and SoundPool.load()) without the need to unpack your ZIP. In order for this to work, you must not perform additional compression on the media files when creating the ZIP packages. For example, when using the zip tool, you should use the -n option to specify the file suffixes that should not be compressed: zip -n .mp4;.ogg main_expansion media_files

所以如何使用winrar制作0%压缩邮件? enter image description here

这里看压缩方法

所以我们必须在Play商店上传这个zip。

所以你不需要使用其他SO回答中提到的 ZipHelper.java

只需使用

即可
ZipResourceFile expansionFile=null;

            try {
                expansionFile = APKExpansionSupport.getAPKExpansionZipFile(getApplicationContext(),3,0);

                     AssetFileDescriptor fd = expansionFile.getAssetFileDescriptor("test.mp3");
                     MediaPlayer mPlayer = new MediaPlayer();
                     mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                     mPlayer.setDataSource(fd.getFileDescriptor(),fd.getStartOffset(),fd.getLength());
                     mPlayer.prepare();
                     mPlayer.start();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

答案 1 :(得分:1)

尝试使用expansionFile.getAssetFileDescriptor("main_expansion/about_eng.mp3")

如果不起作用,请拨打:

ZipResourceFile.ZipEntryRO [] entries = expansionFile.getAllEntries();

并查看文件名:

entries[0].mFileName;

这可能暗示道路应该是什么样子。

我知道这个问题很老,但也许对某人有帮助。

答案 2 :(得分:0)

要阅读mp3,使用mediaplayer,您可以通过3种方式进行阅读

例如,

。我的应用程序包名称是

  

com.bluewindsolution.android.sampleapp

然后我的扩展文件应该是

  

main.1.com.bluewindsolution.android.sampleapp.obb

详细信息,您可以在here

中关注
  

[主|补丁] LT。扩展版本&gt;。&lt; package-name&gt; .obb

从扩展中,您可以通过以下三种方式获得:

通过AssetFileDescriptor

// this one work with image file, media file
// Get a ZipResourceFile representing a specific expansion file
// mainContext, version no. of your main expansion, version no of your patch
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(this, 1, 0); 
AssetFileDescriptor afd_img1 = expansionFile.getAssetFileDescriptor("your_path/your_file.jpg");
AssetFileDescriptor afd_mpbg = expansionFile.getAssetFileDescriptor("your_path/your_file.mp3");

// to set image
ImageView imageView1 = (ImageView)findViewById(R.id.iv1); 
imageView1.setImageBitmap(BitmapFactory.decodeFileDescriptor(afd_iv1.getFileDescriptor()));

// to set sound
try {
    mpbg.setDataSource(afd_mpbg.getFileDescriptor(), afd_mpbg.getStartOffset(), afd_mpbg.getDeclaredLength());
    mpbg.prepareAsync();
    mpbg.start();
} catch (IllegalStateException e) {
    Log.w("Error=====", "Failed to prepare media player", e);
}

通过InputStream

// this one work with image file, media file
// Get a ZipResourceFile representing a specific expansion file

ZipResourceFile expansionFile = new ZipResourceFile(filePathToMyZip);

// Get an input stream for a known file inside the expansion file ZIPs

InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

通过Uri

//this one can use in almost thing such as jpg, mp3, mp4, pdf, etc.

//you need to create new class to override APEZProvider
public class ZipFileContentProvider extends APEZProvider {
    @Override
    public String getAuthority() {
        return "com.bluewindsolution.android.sampleapp";
    }
}

//you need to add <provider> in AndroidManifest.xml
<provider
 android:name="com.bluewindsolution.android.sampleapp.ZipFileContentProvider"
   android:authorities="com.bluewindsolution.android.sampleapp" 
      android:exported="false"
      android:multiprocess="true"
    >
    <meta-data android:name="mainVersion"
              android:value="1"></meta-data>
</provider>

//after that you can use it any time by this code:
String filename2 = "image/i_commu_a_1_1_1_1.jpg"; // suppose you store put your file in directory in .obb
String uriString2 = "content://com.bluewindsolution.android.sampleapp" +  File.separator + filename2;
Uri uri2 = Uri.parse(uriString2);
imageView2.setImageURI(uri2);

// Filename inside my expansion file
String filename = "video/v_do_1_1_1.mp4"; // suppose you store put your file in directory in .obb
String uriString = "content://com.bw.sample_extension_download_main" +  File.separator + filename;
Uri uri = Uri.parse(uriString);

v1 = (VideoView)findViewById(R.id.videoView1);
v1.setVideoURI(uri);
v1.start();