Чтение mp3 из файла расширения

Чтение 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 равна нулю.

Может ли любой орган помочь мне решить эту проблему?

Solutions Collecting From Web of "Чтение mp3 из файла расширения"

Я googled и обнаружил, что нам нужно сделать .zip с 0% (No compression) что упоминается в http://developer.android.com/google/play/expansion-files.html

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

Так как сделать 0% сжатие zip с помощью winrar? Введите описание изображения здесь

Здесь см. Метод сжатия

Поэтому нам нужно загрузить этот почтовый индекс в игровой магазин.

Поэтому вам не нужно использовать ZipHelper.java, который упоминается в другом ответе SO

Просто используйте

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

Чтобы читать mp3, с медиаплеер, вы можете сделать это 3 способа

например. Мое имя пакета приложений

com.bluewindsolution.android.sampleapp

То мой файл расширения должен быть

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

В деталях, вы можете следовать здесь

[Main | patch]. <Расширение-версия>. <Имя-пакета> .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); 

Через Ури

 //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(); процессов //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(); 

Попробуйте использовать expansionFile.getAssetFileDescriptor("main_expansion/about_eng.mp3") .

Если это не работает, вызовите это:

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

И посмотрите имена файлов:

entries[0].mFileName; ,

Это может быть намек на то, как должен выглядеть путь.

Я знаю, что вопрос старый, но, возможно, это помогает кому-то.