我在Web View 中播放声音文件,并使用Javascript调用它们。
这是我使用的代码,但是每次我将新声音称为mediaplayer
实例时都会创建它,因此我无法停止已经播放的声音并且正在运行太多的媒体播放器。
public class AudioInterface {
Context mContext;
AudioInterface(Context c) {
mContext = c;
}
//Play an audio file from the webpage
@JavascriptInterface
public void playAudio(String aud) {
final MediaPlayer mp;
try {
AssetFileDescriptor fileDescriptor =
mContext.getAssets().openFd(aud);
mp = new MediaPlayer();
mp.setDataSource(fileDescriptor.getFileDescriptor(),
fileDescriptor.getStartOffset(),
fileDescriptor.getLength());
fileDescriptor.close();
mp.prepare();
mp.start();
}
catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
如何只创建一个
mediaplayer
实例,以便在播放新实例之前停止当前声音?
最佳答案
以此替换您的代码。注意我是如何在playAudio(...)
之外初始化MediaPlayer的:
public class AudioInterface {
Context mContext;
final MediaPlayer mp;
AudioInterface(Context c) {
mContext = c;
mp = new MediaPlayer();
}
// Play an audio file from the webpage
@JavascriptInterface
public void playAudio(String aud) {
try {
AssetFileDescriptor fileDescriptor = mContext.getAssets().openFd(aud);
mp.reset();
mp.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());
fileDescriptor.close();
mp.prepare();
mp.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
关于android - 仅创建一个Media Player实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30336426/