EspoirX / StarrySky

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

MusicManager.getInstance().getDuration() 出现负数 #131

Closed L-X-J closed 5 years ago

L-X-J commented 5 years ago

调用MusicManager.getInstance().getDuration()的时候返回值为负数,跪求大佬指导一二 日志如下:

E/UpdateProgressTask: position:42347    duration:-9223372036854775807   buffered:64731
E/UpdateProgressTask: position:43341    duration:-9223372036854775807   buffered:64731
E/UpdateProgressTask: position:44341    duration:-9223372036854775807   buffered:64731
E/UpdateProgressTask: position:45343    duration:-9223372036854775807   buffered:64731
E/UpdateProgressTask: position:46345    duration:-9223372036854775807   buffered:64731
E/UpdateProgressTask: position:47350    duration:-9223372036854775807   buffered:64731
E/UpdateProgressTask: position:48342    duration:-9223372036854775807   buffered:64731
E/UpdateProgressTask: position:49349    duration:-9223372036854775807   buffered:64731
D/EventLogger: loading [51.27, 49.75, window=0, period=0, true]
D/EventLogger: timelineChanged [51.35, 49.83, window=0, period=0, periodCount=1, windowCount=1, reason=DYNAMIC
D/EventLogger:   period [79.29]
D/EventLogger:   window [79.29, false, false]
D/EventLogger: ]
D/EventLogger: loading [51.35, 49.83, window=0, period=0, false]
E/UpdateProgressTask: position:50346    duration:79291  buffered:79291
E/UpdateProgressTask: position:51349    duration:79291  buffered:79291
E/UpdateProgressTask: position:52346    duration:79291  buffered:79291

过一会就正常了 我是这么调用的

mTimerTask.setUpdateProgressTask {
            val position = MusicManager.getInstance().playingPosition
            val duration = MusicManager.getInstance().duration
            val buffered = MusicManager.getInstance().bufferedPosition
            Log.e("UpdateProgressTask","position:$position\tduration:$duration\tbuffered:$buffered")
            if (seekBar.max.toLong() != duration) {
                seekBar.max = duration.toInt()
            }
            seekBar.progress = position.toInt()
            seekBar.secondaryProgress = buffered.toInt()
            playingTime.text=formatMusicTime(position)
            totalTime.text=formatMusicTime(duration)
        }
wizcheu commented 5 years ago

一般首次打开的时候,服务连接的回调还没有回来,会导致获取duration的时候连接未连接,未能获取到正确的duration,我推荐你可以clone代码下来自己改。

/**
 * 获取媒体时长,单位毫秒
 */
public long getDuration(String songUrl) {
    long duration = -1;
    MediaSessionConnection connection = MediaSessionConnection.getInstance();
    // 一般来说,首次启动会导致连接未建立
    if (connection.isConnected()) {
        duration = connection.getNowPlaying().getLong(MediaMetadataCompat.METADATA_KEY_DURATION);
        //如果没设置duration
        if (duration == 0) {
            if (mPlayback != null) {
                duration = mPlayback.getDuration();
            }
        }
        //当切换歌曲的时候偶尔回调为 -9223372036854775807  Long.MIN_VALUE
        if (duration < -1){
            // TODO BUG
            return -1;
        }
    } else {
        MediaPlayer mp = MediaPlayer.create(sContext, Uri.parse(songUrl));
        duration = (long) mp.getDuration();
    }
    return duration;
}

因为MediaPlayer创建需要歌曲地址,所以签名也得改。

这也只是个暂时折中的方法,期待作者早日修复!

EspoirX commented 5 years ago

出现负数一般是音频没加载完所以获取不到时长,判断一下就行

L-X-J commented 5 years ago

OK,加了判断<0的时候进度不展示