Android 从APK扩展文件加载带有音频的SoundPool
在报告中说: 如果您使用扩展文件存储媒体文件,请使用ZIP文件 仍然允许您使用Android媒体播放呼叫,提供 偏移量和长度控件(如MediaPlayer.setDataSource()和 SoundPool.load()) 我有10个小的.ogg文件,我想使用SoundPool.load(FileDescriptor fd,long offset,long length,int priority)来加载这些音频文件。我已经编写了一些代码,但运行时会收到错误消息: “无法加载样本:(空)” ,显然音频没有播放。以下是我的尝试:Android 从APK扩展文件加载带有音频的SoundPool,android,audio,soundpool,apk-expansion-files,Android,Audio,Soundpool,Apk Expansion Files,在报告中说: 如果您使用扩展文件存储媒体文件,请使用ZIP文件 仍然允许您使用Android媒体播放呼叫,提供 偏移量和长度控件(如MediaPlayer.setDataSource()和 SoundPool.load()) 我有10个小的.ogg文件,我想使用SoundPool.load(FileDescriptor fd,long offset,long length,int priority)来加载这些音频文件。我已经编写了一些代码,但运行时会收到错误消息: “无法加载样本:(空)” ,显
public class MainActivity extends Activity {
SoundPool sounds;
boolean loaded = false;
int streamID;
int theId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.gc();
setContentView(R.layout.activity_main);
sounds = new SoundPool(10, AudioManager.STREAM_MUSIC,0);
sounds.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool sp, int sid, int status) {
loaded = true;
}});
loadSounds();
playSound(theID);
}
private void loadSounds() {
AssetFileDescriptor descriptor = null;
try {
descriptor = getFileDescriptor(this, "audio_files/end_credits.ogg");
} catch (Exception e) {
} finally {
if (descriptor != null)
try{descriptor.close();} catch (IOException e) {}
}
theId = sounds.load(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength(), 1);
}
public static AssetFileDescriptor getFileDescriptor(Context ctx, String path) {
AssetFileDescriptor descriptor = null;
try {
ZipResourceFile zip = APKExpansionSupport.getAPKExpansionZipFile(ctx, 4, -1);
descriptor = zip.getAssetFileDescriptor(path);
} catch (IOException e) {
e.printStackTrace();
}
return descriptor;
}
private void playSound(int soundID){
if(loaded){
streamID = sounds.play(soundID, 1, 1, 1, 0, 1);}
}
}
好吧,看来原因是音频加载速度不够快。我把播放声音(theID);就在loadSounds()之后;然而,它需要几秒钟的时间来加载,然后才能播放。但代码正在运行到这一点