Android音乐播放器4.0(播放详情页下)

330 阅读1分钟

这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战

歌词显示

1、从服务器通过 url 把歌词下载到本地。通过输入流按行读取,每读一行,把这一行的歌词封装到 HashMap<String,String> 中 2、每当更新音乐进度时(1s/次),需要判断当前时间是否需要更新歌词

根据 song_id 获取歌曲信息的接口中 lyric字段是 lrc 歌词,根据链接下载 lrc 歌词。我们用到的接口是:

music.163.com/api/song/me…

因此 UrlFactory 中增加查询歌词的方法

public static String getMusicLyric(String id) {
        String url = "https://music.163.com/api/song/media?id=" + id;
        return url;
}

返回的 json 数据格式为 在这里插入图片描述

MusicModel 中增加下载歌词的方法

public void downloadLrc(final String lrclink, final LrcCallback callback) {
        AsyncTask<String,String, HashMap<String,String>> task = new AsyncTask<String, String, HashMap<String, String>>() {
            @Override
            protected HashMap<String, String> doInBackground(String... strings) {
                try {
                    InputStream is = HttpUtils.getInputStream(lrclink);
                    String json = HttpUtils.isToString(is);
                    Log.d("info", json);

                    JSONObject object = new JSONObject(json);
                    String lyric = object.getString("lyric");
                    Log.d("TTT",lyric);

                    InputStream inputStream = new ByteArrayInputStream(lyric.getBytes());
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                    String line = "";
                    HashMap<String,String> lrc = new HashMap<>();
                    while ((line = reader.readLine())!=null){//读到了歌词的一行
                        if(line.length()<10){//一行中的数据不够解析
                            continue;
                        }
                        //line:[00:07.000]音乐推广营销:奔跑怪物
                        //由于是显示每秒的歌词,所以截取00:07
                        String key = line.substring(1,6);
                        String value;
                        if(line.length() == 11){//说明只有时间
                            value = "";
                        }else {
                            value = line.substring(11);
                        }
                        lrc.put(key,value);
                    }
                    return lrc;
                } catch (IOException | JSONException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(HashMap<String, String> hashMap) {
                //返回上面的lrc
                callback.onLrcLoaded(hashMap);
            }
        };
        task.execute();
    }

增加一个 LrcCallback

/**
 * 歌词相关的回调
 */
public interface LrcCallback {
    /**
     * 当歌词解析完毕执行
     *
     * @param lrc
     */
    void onLrcLoaded(HashMap<String, String> lrc);
}

在 MusicItem 这个 model 中增加

    public HashMap<String,String> lrc;

Activity 中

public class TestActivity extends AppCompatActivity implements View.OnClickListener {
	......
    private TextView img_play_music_lrc;

	......
    private void setViews() {
        ......
        img_play_music_lrc = findViewById(R.id.img_play_music_lrc);
    }
	......
    /**
     * 接收音乐信息的广播接收器
     */
    class MusicInfoBroadCastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Globalconsts.ACTION_UPDATE_MUSIC_PROGRESS)) {
                ......
                MusicApplication app = MusicApplication.getApp();
                MusicItem music = app.getCurrentMusic();
                HashMap<String,String> lrc = music.lrc;
                if(lrc!=null){//根据当前时间,获取歌词内容,更新textview
                    String lrcContent = lrc.get(currentStr);
                    if(lrcContent!=null){
                        img_play_music_lrc.setText(lrcContent);
                    }
                }
            } else if (action.equals(Globalconsts.ACTION_MUSIC_STARTED)) {
                ......

                //加载歌词
                musicModel.downloadLrc(UrlFactory.getMusicLyric(music.id), new LrcCallback() {
                    @Override
                    public void onLrcLoaded(HashMap<String, String> lrc) {
                        //将下载好的歌词存入music对象
                        music.lrc = lrc;
                        Log.d("TTT",lrc.toString());
                        //把相对应的歌词呈现在界面上
                        //每隔1s更新歌词内容
                        //在更新音乐进度的广播接收器中更新即可
                    }
                });
            }
        }
    }
    ......
}

运行效果图

在这里插入图片描述