Android 安卓:为什么我不能在点击按钮后播放声音?
我已经做了,如果用户点击按钮,然后声音播放。但现在我听不到一些点击后的声音。我不知道为什么 这是我用来播放声音的代码 代码: 单击几下后,我在logcat中得到了这种类型的错误消息: 日志:Android 安卓:为什么我不能在点击按钮后播放声音?,android,audio,android-ndk,media-player,Android,Audio,Android Ndk,Media Player,我已经做了,如果用户点击按钮,然后声音播放。但现在我听不到一些点击后的声音。我不知道为什么 这是我用来播放声音的代码 代码: 单击几下后,我在logcat中得到了这种类型的错误消息: 日志: 我认为问题在于你没有等到第一次完成(或停止)才开始第二次。。 完成后,请尝试收听上一个,然后启动下一个。。您可以使用setOnCompletionListener 类似问题: 代码: package ooo.iii; import java.io.IOException; i
我认为问题在于你没有等到第一次完成(或停止)才开始第二次。。 完成后,请尝试收听上一个,然后启动下一个。。您可以使用setOnCompletionListener 类似问题: 代码:
package ooo.iii;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Test_audioActivity extends Activity {
/** Called when the activity is first created. */
Button btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
setContentView(R.layout.main);
btn=(Button)findViewById(R.id.ss);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
playSound(R.raw.musi);
}
});
}
public void playSound(int resources){
try{
boolean mStartPlaying = true;
MediaPlayer mPlayer=null;
if (mStartPlaying==true){
mPlayer = new MediaPlayer();
Uri uri = Uri.parse("android.resource://ooo.iii/" + resources);
mPlayer.setDataSource(getApplicationContext(),uri);
mPlayer.prepare();
mPlayer.start();
}
else{
// stopPlaying();
//rePlay.setText("Replay");
mPlayer.release();
mPlayer = null;
}
mStartPlaying = !mStartPlaying;
}
catch (IOException e){
Log.e("ERR", "prepare() failed");
}
}
}
您需要更改:
1-来源@res/raw/musi。。给你的
2-res/layout/main.xml处的按钮id从ss到您的
3-Uri=Uri.parse(“android。resource://ooo.iii/“+资源);将包名修改为您的包名
就这些。。我在真实设备上进行了测试,多次单击,在仍在播放的前一个设备上获得了新的声音您需要释放()媒体播放器,否则资源不会释放,您很快就会耗尽内存(因为您下次会再次分配它们)。
所以,我认为你可以玩两次甚至三次。。。但不是很多次没有释放资源
建议在不再使用MediaPlayer对象后,立即调用release(),以便立即释放与MediaPlayer对象关联的内部播放器引擎使用的资源。资源可能包括单例资源,如硬件加速组件,调用release()失败可能会导致MediaPlayer对象的后续实例退回到软件实现或完全失败。MediaPlayer的设计不适合您尝试使用它的方式。这就是你面临问题的原因
MediaPlayer是`当您播放小音效时,这不是一个好的选择,因为用户可以很快单击多个按钮,并且您必须为所有按钮创建一个MP对象,而不是在您单击按钮时同步进行。选择SoundPool类,该类允许您在内存中加载较小的声音,您可以随时播放这些声音,而不会像在mediaplayer中那样感觉到任何延迟。这是一个很好的教程:我也遇到了同样的问题,我使用OnCompletionListener中的release()方法解决了这个问题:
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resource);
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
我明白你的意思,但如果你想再玩一次,即使它没有停下来,那么?在这种情况下。。使用mediaplayer的另一个实例。。重点是,如果它忙于其他事情,就不要使用同一个对象。好的,它对我有用吗?我的意思是,如果我连续单击同一个按钮,那么?我想是的,将mPlayer作为局部变量比类成员实例更容易。。因此,无论何时调用playSound(..),都将使用另一个版本的变量…抱歉,RAJU。。你错了,我现在在我的设备上进行了测试,它可以正常工作。。我将在我的答案中包含的代码作为更新…如果可以,请使用soundPool。在处理能力较低的手机上,多个MediaPlayer实例将开始滞后。我遇到了这个问题,不得不改用SoundPool
package ooo.iii;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Test_audioActivity extends Activity {
/** Called when the activity is first created. */
Button btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
setContentView(R.layout.main);
btn=(Button)findViewById(R.id.ss);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
playSound(R.raw.musi);
}
});
}
public void playSound(int resources){
try{
boolean mStartPlaying = true;
MediaPlayer mPlayer=null;
if (mStartPlaying==true){
mPlayer = new MediaPlayer();
Uri uri = Uri.parse("android.resource://ooo.iii/" + resources);
mPlayer.setDataSource(getApplicationContext(),uri);
mPlayer.prepare();
mPlayer.start();
}
else{
// stopPlaying();
//rePlay.setText("Replay");
mPlayer.release();
mPlayer = null;
}
mStartPlaying = !mStartPlaying;
}
catch (IOException e){
Log.e("ERR", "prepare() failed");
}
}
}
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resource);
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});