[英]Media Player on Android stops sounds all together
我看过很多关于它提前停止声音的帖子。 这不是我的问题。 我的问题是……我有这 25 种声音并正常工作。 当手机摇晃时,它会说话,显示文本,并有一个 animation 所以这个人看起来像是在说话。 一开始它工作得很好。 我能够重现我的客户发现的问题的唯一方法是多次摇晃它,然后单击返回。 摇回它并摇动无数次,然后再次点击。 当我再次摇回它几次时,它起作用了,然后突然所有声音都消失了。 偶尔会有一个工作,但如果再次返回并返回它通常会停止发出声音。 其他一切都按应有的方式发挥作用。 有人遇到过这个吗? 任何帮助,将不胜感激。
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();
}
}
只是对问题的轻微补充。 在我没有声音发生后,即使在应用程序关闭并重新打开后它也会继续发生。
好的,在评论中发布的内容有点多,所以这就是您需要使用 setDataSource() 执行的操作。 如果您查看setDataSource() 的文档,您会发现它需要FileDescriptor
。 您可以像这样为 Raw 资源获取一个:
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();
从您的代码来看,您似乎是在点击时创建 MediaPlayer。 但我没有看到任何停止/释放它的代码。 因此,您的应用程序可能会耗尽资源,最终停止其他媒体播放器内容。 这就是为什么在几次震动事件之后,这个问题得到了支撑。
沙什
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.