0
点赞
收藏
分享

微信扫一扫

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

歌词显示

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

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

​​https://music.163.com/api/song/media?id=167876​​

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

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

返回的 json 数据格式为
音乐播放器4.0(播放详情页下)_广播接收器

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更新歌词内容
//在更新音乐进度的广播接收器中更新即可
}
});
}
}
}
......
}

运行效果图
音乐播放器4.0(播放详情页下)_json_02


举报

相关推荐

0 条评论