EspoirX / StarrySky

🔥A Powerful and Streamline MusicLibrary(一个丰富的音乐播放封装库,支持多种音频格式,完美解决你的问题。)
https://github.com/EspoirX/StarrySky
MIT License
1.39k stars 210 forks source link

建议:播放出错后,无法继续重新加载播放,可以设置reload,播放器默认只创建一次 #129

Closed fenggit closed 4 years ago

fenggit commented 4 years ago

问题:网络不好稳定的错误: ExoPlayer error Unable to connect to http://xxxxxxxxx.mp3

再次调用: MusicManager.getInstance().playMusic() 还是没有播放,退出重新加载才可以,还有isSkipToNextEnabled和isSkipToPreviousEnabled有时候不准确

解决方法:

  1. 第一种方法直接在出错的时候把mExoPlayer=null,这种方法不好,会导致player重新创建

2.第二种方法:增加isNeedReload标记,是否重新加载,其次mExoPlayer不应该每次切歌曲的时候创建1个,而是init一次,我是把player放到构造方法里面创建1次。

` @Override public void play(QueueItem item, boolean isPlayWhenReady) { mPlayOnFocusGain = true; String mediaId = item.getDescription().getMediaId(); boolean mediaHasChanged = !TextUtils.equals(mediaId, mCurrentMediaId); if (mediaHasChanged) { mCurrentMediaId = mediaId; } if (mediaHasChanged || isNeedReload) { releaseResources(false); // release everything except the player MediaMetadataCompat track = mMusicProvider.getMusic(item.getDescription().getMediaId());

        String source = track.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI);
        if (TextUtils.isEmpty(source)) {
            return;
        }
        source = source.replaceAll(" ", "%20"); // Escape spaces for URLs
        //缓存歌曲
        //if (ExoDownload.getInstance().isOpenCache()) {
        //    ExoDownload.getInstance().getDownloadTracker().toggleDownload(mediaId, Uri.parse(source), "");
        //}

        MediaSource mediaSource = buildMediaSource(dataSourceFactory, Uri.parse(source), null);
        mExoPlayer.prepare(mediaSource);
        isNeedReload = false;
    }

    if (isPlayWhenReady) {
        mExoPlayer.setPlayWhenReady(true);
    }
}

`

EspoirX commented 4 years ago

最近比较忙,没时间搞github,你可以自己研究下改改,提个 Pull requests ,后面有空的时候会看看的

EspoirX commented 4 years ago

最新版本已经解决