我见过很多关于它早早停止声音的帖子。这不是我的问题。我的问题是这个...我有这25个声音起作用。当电话被摇动时,它会说话,显示文本,并且有一个动画,所以这个人看起来像是在说话。它起初工作得很好。我能够重现我的客户发现的问题的唯一方法是多次摇动,然后点击返回。摇晃回来并摇晃很多次,然后再次点击回来。当我再次摇回它几次然后工作突然所有声音切断。偶尔会有一个可以工作,但如果再次返回并且重新进入它通常会停止发出声音。其他所有功能都应该如此。以前遇到过这个人吗?任何帮助将不胜感激。
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();
}
}
只是对问题的一点点补充。在我听到没有声音后,即使应用程序关闭并重新打开,它仍会继续发生。
答案 0 :(得分:1)
好的,这在评论中发布有点多,所以这就是你需要用setDataSource()做的事情。如果您查看docs for setDataSource(),则会看到它需要FileDescriptor
。您可以为原始资源获取一个,如下所示:
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();
答案 1 :(得分:0)
从您的代码中,您似乎在点击时创建了MediaPlayer。但我没有看到任何代码来停止/释放它。因此,您的应用程序可能会耗尽资源,最终会停止其他媒体播放器内容。这就是为什么在经历了几次震动之后,这个问题正在得到支撑。
词shash