应用程序中的音频文件不会在单击时停止,它会再次开始播放
Audio file in application doesn't stop on click, it starts playing again
所以我在我的应用程序中放置了一个音频文件,当我触摸按钮时它会播放,当我再次触摸它时它会停止。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button one = (Button) findViewById(R.id.buttonId);
final MediaPlayer mp = new MediaPlayer();
one.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
if(mp.isPlaying())
{
mp.stop();
}
try {
mp.reset();
AssetFileDescriptor afd;
afd = getAssets().openFd("mosq.mp3");
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
mp.prepare();
mp.setLooping(true);
mp.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
这是我的代码,这部分:
if(mp.isPlaying())
{
mp.stop();
}
由于某种原因没有工作。
确保在 mp.stop()
下方放置 return
语句。
据我所知,声音确实停止了,但随后又开始了,因为代码的下一部分仍在执行
正如 George D 正确指出的那样,您可以无条件地开始播放媒体,即使您刚刚停止播放也是如此。您可以使用他的解决方案或执行以下操作:
if(mp.isPlaying())
{
mp.stop();
}
else {
try {
mp.reset();
AssetFileDescriptor afd;
afd = getAssets().openFd("mosq.mp3");
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
mp.prepare();
mp.setLooping(true);
mp.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
这还有其他几个潜在的错误:
* 我不确定这是否是您想要的,但播放器永远不会暂停,只是停止并从头开始。如果您尝试恢复或再次播放,每次都会完全重新加载音频文件。这至少是一种资源浪费,而且从 UI 的角度来看,这可能不是预期的行为。
* 您不想将 MediaPlayer 对象定义为 OnCreate 方法中的局部变量。这有效的唯一原因是你有内存泄漏(你永远不会为点击取消订阅你的事件处理程序);如果您没有内存泄漏,一旦您完成 onCreate 方法,该对象将符合垃圾回收条件,并且就框架而言,它不再存在。
所以我在我的应用程序中放置了一个音频文件,当我触摸按钮时它会播放,当我再次触摸它时它会停止。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button one = (Button) findViewById(R.id.buttonId);
final MediaPlayer mp = new MediaPlayer();
one.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
if(mp.isPlaying())
{
mp.stop();
}
try {
mp.reset();
AssetFileDescriptor afd;
afd = getAssets().openFd("mosq.mp3");
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
mp.prepare();
mp.setLooping(true);
mp.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
这是我的代码,这部分:
if(mp.isPlaying())
{
mp.stop();
}
由于某种原因没有工作。
确保在 mp.stop()
下方放置 return
语句。
据我所知,声音确实停止了,但随后又开始了,因为代码的下一部分仍在执行
正如 George D 正确指出的那样,您可以无条件地开始播放媒体,即使您刚刚停止播放也是如此。您可以使用他的解决方案或执行以下操作:
if(mp.isPlaying())
{
mp.stop();
}
else {
try {
mp.reset();
AssetFileDescriptor afd;
afd = getAssets().openFd("mosq.mp3");
mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
mp.prepare();
mp.setLooping(true);
mp.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
这还有其他几个潜在的错误:
* 我不确定这是否是您想要的,但播放器永远不会暂停,只是停止并从头开始。如果您尝试恢复或再次播放,每次都会完全重新加载音频文件。这至少是一种资源浪费,而且从 UI 的角度来看,这可能不是预期的行为。
* 您不想将 MediaPlayer 对象定义为 OnCreate 方法中的局部变量。这有效的唯一原因是你有内存泄漏(你永远不会为点击取消订阅你的事件处理程序);如果您没有内存泄漏,一旦您完成 onCreate 方法,该对象将符合垃圾回收条件,并且就框架而言,它不再存在。