android - 在 BaseAdapter android 中停止媒体播放器

标签 android android-mediaplayer baseadapter

我有一个带有 ListViewFragment,它是一个声音列表,以这种方式填充:

MediaPlayer mMediaPlayer;

listview.setAdapter(new ListAdapter(getActivity(), tit, desc, songs, filenames, mMediaPlayer));

MediaPlayer 作为参数给出,因为我希望当按下后退按钮或应用程序进入后台时,播放器将停止播放。 所以我在我的 fragment 中重写了 onPause 和 onDestroy 方法,但这不起作用。即使应用程序关闭,声音也会继续播放。这是我的代码:

         @Override
        public void onDestroy() {
          // TODO Auto-generated method stub
          if (mMediaPlayer != null) {
              mMediaPlayer.stop();
              mMediaPlayer.release();
              mMediaPlayer = null; 
          }
          super.onDestroy();
         }

         @Override
        public void onPause() {
          // TODO Auto-generated method stub
          if (mMediaPlayer != null) {
              mMediaPlayer.stop();
              mMediaPlayer.release();
              mMediaPlayer = null; 
          }
          super.onPause();
         }

我在我的 BaseAdapter 类中以这种方式播放声音:

public void playSound2(int pos){

        if(isPlaying){  
            mMediaPlayer.stop();  
            mMediaPlayer.release();
            mMediaPlayer = null;
            isPlaying = false;

    }
        mMediaPlayer = MediaPlayer.create(context, songs[pos]);
        mMediaPlayer.start();
        isPlaying = true;

    }

你有什么建议吗?谢谢。

最佳答案

我的第一个建议是:不要使用适配器与媒体播放器交互。相反,将一个项目点击监听器附加到您的 ListView ,如下所示

listView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ...
    }});

并在 onItemClick 回调中对媒体播放器执行任何您想要的操作。

话虽如此,您应该在 onclicklistener 内重置媒体播放器,如下所示

try {
       mPlayer.reset();
       mPlayer.setDataSource(trackToBePlayed); //trackToBePlayed is dependent on the select position
       mPlayer.setOnPreparedListener(mPreparedListener);
       mPlayer.prepareAsync();

} catch (IOException e) {

} catch(IllegalArgumentException e) {

}

在 mPreparedListener 中,准备好后,就可以了

mPreparedListener = new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
};

这应该足以为您指明正确的方向:)

关于android - 在 BaseAdapter android 中停止媒体播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27005488/

相关文章:

android - 无法将已编译的着色器链接到 OpenGL ES 2.0 Android 程序

android - 如何在android中使用元素标签查找xml元素

android - 获取在Android Media Player中播放的音频的幅度或频率

android - ListView:实现MediaPlayer用于列表项(非音乐)

android - 如何在 Android 的 Mediaplayer 中显示编码的视频文件?

java - BaseAdapter类方法需要显式调用吗?

android - 添加 RawContact 以便它聚合到现有联系人

android - 如何在android中获取内部和外部sdcard路径

android - 如何从自定义基础适配器调用函数

android - ListView 从自定义 BaseAdapter 中删除项目