应用程序中的音频文件在点击时不会停止,它会再次开始播放

时间:2016-08-11 19:20:56

标签: android android-mediaplayer

所以我在我的应用程序中放了一个音频文件,当我触摸按钮时,它就会停止播放,当我再次触摸它时停止播放。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    Button one = (Button) findViewById(R.id.buttonId);
    final MediaPlayer mp = new MediaPlayer();

    one.setOnClickListener(new View.OnClickListener(){

        public void onClick(View v) {
            if(mp.isPlaying())
            {
                mp.stop();
            }

            try {
                mp.reset();
                AssetFileDescriptor afd;
                afd = getAssets().openFd("mosq.mp3");
                mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                mp.prepare();
                mp.setLooping(true);
                mp.start();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


});

这是我的代码,这部分:

if(mp.isPlaying())
        {
            mp.stop();
        }

由于某种原因没有工作。

2 个答案:

答案 0 :(得分:2)

请务必在return下面添加mp.stop()声明。

从我能理解的声音确实停止但是它再次启动,因为代码的下一部分仍然被执行

答案 1 :(得分:0)

正如George D正确指出的那样,即使你刚刚停止播放,你也会无条件地开始播放媒体。您可以使用他的解决方案或执行以下操作:

if(mp.isPlaying())
        {
            mp.stop();
        }
        else {
          try {
            mp.reset();
            AssetFileDescriptor afd;
            afd = getAssets().openFd("mosq.mp3");
            mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
            mp.prepare();
            mp.setLooping(true);
            mp.start();
          } catch (IllegalStateException e) {
            e.printStackTrace();
          } catch (IOException e) {
            e.printStackTrace();
          }
       }

这还有其他几个潜在的错误:
*我不确定这是否是你想要的,但玩家不会暂停,只需从头开始停止并重启。如果您尝试恢复或再次播放,则每次都会完全重新加载音频文件。至少这是浪费资源,而且从UI的角度来看,这可能不是预期的行为 *您不希望将MediaPlayer对象定义为OnCreate方法中的局部变量。这个工作的唯一原因是你有内存泄漏(你永远不会取消订阅你的事件处理程序的点击);如果你没有内存泄漏,一旦你完成onCreate方法,对象就有资格进行垃圾收集,并且就框架而言,它将不再存在。