Android上的媒体播放器会同时停止播放声音
我看过很多关于它的帖子,很早就停止了声音。这不是我的问题。我的问题是。。。我有这25个声音,正在工作。当手机被摇晃时,它会说话,显示文本,并有一个动画,使人看起来像是在说话。一开始它工作得很好。我能够重现我的客户发现的问题的唯一方法是多次摇晃它,然后单击“上一步”。摇回它并多次摇动,然后再次单击“上一步”。当我再次摇回它几次时,它工作了,然后突然所有的声音都消失了。偶尔一个会工作,但如果再回来,回到它通常停止发出声音一起。其他一切都正常运转。以前有人遇到过这种情况吗?任何帮助都将不胜感激Android上的媒体播放器会同时停止播放声音,android,audio,media-player,Android,Audio,Media Player,我看过很多关于它的帖子,很早就停止了声音。这不是我的问题。我的问题是。。。我有这25个声音,正在工作。当手机被摇晃时,它会说话,显示文本,并有一个动画,使人看起来像是在说话。一开始它工作得很好。我能够重现我的客户发现的问题的唯一方法是多次摇晃它,然后单击“上一步”。摇回它并多次摇动,然后再次单击“上一步”。当我再次摇回它几次时,它工作了,然后突然所有的声音都消失了。偶尔一个会工作,但如果再回来,回到它通常停止发出声音一起。其他一切都正常运转。以前有人遇到过这种情况吗?任何帮助都将不胜感激 pub
public class Ask extends Activity{
private SensorManager mSensorManager;
private ShakeEventListener mSensorListener;
String[] answer;
int possibleAnswers, randomAnswer, talkRun=0, last=-1;
int shake0;
long lastClick;
private MediaPlayer mp, sound0;
Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ask);
Intent type = getIntent();
lastClick = type.getLongExtra("lastClick", 0);
context=this;
final Random generator = new Random();
possibleAnswers = 1;
answer = new String[possibleAnswers];
answer[0]="***Coughing***";
//Sounds
setVolumeControlStream(AudioManager.STREAM_MUSIC);
mp = MediaPlayer.create(this, R.raw.askbud);
mp.start();
mSensorListener = new ShakeEventListener();
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
final TextView tv = (TextView)findViewById(R.id.answer);
mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() {
public void onShake() {
if (System.currentTimeMillis() - lastClick > 900) {
lastClick = System.currentTimeMillis();
randomAnswer = generator.nextInt(possibleAnswers);
if(last==randomAnswer)
randomAnswer = generator.nextInt(possibleAnswers);
animation();
if(randomAnswer==0){
if(shake0>=1){
sound0.reset();
}
shake0++;
sound0 = MediaPlayer.create(context, R.raw.coughing);
try {
sound0.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sound0.start();
}
});
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onStop() {
mSensorManager.unregisterListener(mSensorListener);
super.onStop();
}
}
这只是问题的一点补充。在我得到没有声音发生后,即使在应用程序关闭和重新打开后,它仍会继续发生 从您的代码来看,您似乎正在单击创建MediaPlayer。但是我没有看到任何代码来停止/释放它。因此,您的应用程序可能会耗尽资源,最终停止其他媒体播放器内容。这就是为什么在几次震动事件之后,这个问题得到了支持
Shash好的,在评论中要发布的内容有点多,下面是您需要对setDataSource()执行的操作。如果您检查,您将看到它需要一个
文件描述符
。您可以为原始资源获取一个,如下所示:
Resources res = getResources();
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.coughing);
FileDescriptor fd = afd.getFileDescriptor();
//assuming existing MediaPlayer mp
mp.reset();
mp.setDataSource(fd);
mp.prepare();
mp.start();
Nah MediaPlayer正在onCreate中创建,声音的分配在onShake中。因此,如果我在顶部的onShake中放置sound0.stop()等,可能会解决问题?停止并释放MediaPlayer当您调用
sound0.reset()
时,您应该调用sound0.release()
。或者(这是我的首选),使用sound0.setDataSource()
而不是sound0=MediaPlayer.create()
,并保持reset()
调用不变。这将使MediaPlayer保持实例化状态,但更改声音并准备再次播放。@kcoppock Ok,因此我尝试了该版本,但问题仍然存在。对于sound0.setDataSource(),如何调用该文件?sound0.setDataSource(R.raw.咳嗽);不起作用,我不知道还有什么可以放在里面;评论太多,无法容纳。感谢您花时间这么做。我试试看,我一定是做错了什么。我在每个if(randomAnswer==)部分都输入了这个,没有声音发生。这一定是我初始化mp的方式。它以高于静止状态的方式初始化。我应该如何初始化它?对MediaPlayer不是很有经验。谢谢您的帮助。我们只需初始化一个,以MediaPlayer mp=new MediaPlayer()
开头。然后,它应该处于接受数据源的状态。我强烈建议您仔细阅读以下链接。如果你真的能理解这一点,那么你遇到的整个问题对你来说就会更有意义:多谢了,我会仔细考虑的。