Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RecyclerView中的媒体播放器错误_Java_Android_Android Mediaplayer - Fatal编程技术网

Java RecyclerView中的媒体播放器错误

Java RecyclerView中的媒体播放器错误,java,android,android-mediaplayer,Java,Android,Android Mediaplayer,我有一个显示歌曲列表的RecyclerView,我已经成功地用它实现了点击监听器,并用日志验证了它。现在我想在点击事件时播放这首歌。当我第一次点击某个项目时,歌曲开始播放,但如果我点击任何其他项目,应用程序就会崩溃 这是我的RecycleServiceClickListener SongAdapter songAdapter = new SongAdapter(getContext(), songsList, new RecyclerViewClickListener() { @

我有一个显示歌曲列表的RecyclerView,我已经成功地用它实现了点击监听器,并用日志验证了它。现在我想在点击事件时播放这首歌。当我第一次点击某个项目时,歌曲开始播放,但如果我点击任何其他项目,应用程序就会崩溃

这是我的RecycleServiceClickListener

SongAdapter songAdapter = new SongAdapter(getContext(), songsList, new RecyclerViewClickListener() {
        @Override
        public void onClick(View view, int position) {
            Toast.makeText(getContext(), "You clicked on Ssong "+songsList.get(position).getSongName(), Toast.LENGTH_SHORT)
                    .show();
            songPath = songsList.get(position).getUrl();
            Log.v("Song Path", songPath);
            if(mp.isPlaying())
                releaseMediaResources();
            playSong();
        }
    });
recyclerView.setAdapter(songAdapter);
这是我的播放歌曲的方法

private void playSong () {
        if(!songPath.equals("")) {
            try {
                mp.setDataSource(songPath);
            } catch (Exception e) {
                Log.e("Home Fragment", "Error setting song Url", e);
            }
            mp.prepareAsync();
            mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    mp.stop();
                    mp.reset();
                    mp.release();
                }
            });
        }
    }
这是我的releaseMediaResources

private void releaseMediaResources() {
    mp.stop();
    mp.reset();
    mp.release();
}
这些都是错误

java.lang.IllegalStateException
    at android.media.MediaPlayer.isPlaying(Native Method)
    at com.ashutosh.prototype4.HomeFragment.playSong(HomeFragment.java:159)
    at com.ashutosh.prototype4.HomeFragment.releaseMediaResources(HomeFragment.java:192)
    at com.ashutosh.prototype4.HomeFragment.access$100(HomeFragment.java:31)
    at com.ashutosh.prototype4.HomeFragment$2.onClick(HomeFragment.java:94)
    at com.ashutosh.prototype4.SongAdapter$1.onClick(SongAdapter.java:50)

根据我的说法,主要问题在于设置媒体播放器,因为当我只显示toast消息时,根本没有问题,但一旦我实现媒体播放器的点击方式,崩溃就会发生

我会在每次新的媒体播放器出现时创建,但当然要尝试检查,如果实例中尚未存在实例,请执行以下操作:

private MediaPlayer mediaPlayer;

private void playSong(String filePath) {
    if (mediaPlayer != null && mediaPlayer.isPlaying()){
        mediaPlayer.stop();
    }

    mediaPlayer = MediaPlayer.create(getActivity(), Uri.parse(filePath));
    mediaPlayer.setVolume(DEFAULT_VOLUME_MUSIC, DEFAULT_VOLUME_MUSIC);
    mediaPlayer.start();
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {

        }
    });
}

创建媒体播放器的单例类