繁体   English   中英

Android 上的媒体播放器一起停止声音

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM