歌词显示

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 数据格式为

MusicModel 中增加下载歌词的方法

public void downloadLrc(final String lrclink, final LrcCallback callback) {AsyncTask<String,String, HashMap<String,String>> task = new AsyncTask<String, String, HashMap<String, String>>() {@Overrideprotected 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:07String 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;}@Overrideprotected void onPostExecute(HashMap<String, String> hashMap) {//返回上面的lrccallback.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 {@Overridepublic 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){//根据当前时间,获取歌词内容,更新textviewString 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() {@Overridepublic void onLrcLoaded(HashMap<String, String> lrc) {//将下载好的歌词存入music对象music.lrc = lrc;Log.d("TTT",lrc.toString());//把相对应的歌词呈现在界面上//每隔1s更新歌词内容//在更新音乐进度的广播接收器中更新即可}});}}}......
}

运行效果图

【达内课程】音乐播放器4.0(播放详情页下)相关推荐

  1. 迷你音乐播放器v1.0正式上线!

    迷你音乐播放器V1.0正式上线! 版本介绍: 1.随机播放切换开关(通过点击专辑图片) 2.通过拖动歌曲名及艺术家名调整歌曲播放进度 3.手机浏览访问支持熄屏播放 4.暂不支持在线搜索功能 快来一起分 ...

  2. Flash版(迷你音乐播放器mp3Player1.0 Beta1 )附源码

    迷你音乐播放器mp3Player1.0 Beta1  ================= //What's new: 主要功能特色: 1.支持歌曲名称,歌手名称以及专辑等关键字搜索. 2.支持随机搜索 ...

  3. (1)H5实现音乐播放器【正在播放-歌词篇】

    近期闲来无事,就想着复习一下前端的东西,然后正好跟朋友搞了一个公共开放的音乐api接口,就想着写一个音乐播放器玩玩! 话不多说,直接上图,然后上代码 [播放器显示正在播放] 实现功能: 1:歌词随着歌 ...

  4. HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌)

    用HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌) 效果如下:(鼠标点击按钮可以实现播放或暂停,按钮会旋转,实现了歌词同步,功能还需改进) 代码如下: <!DOCTYPE htm ...

  5. 秀杰音乐盒之mtv播放器 v1.0 怎么用

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  6. 安捷影音播放器 v16.0.3 官方版

    安捷影音播放器 v16.0.3 官方版 软件大小:4.78MB 软件语言:简体中文 软件类别:影音播放 软件授权:官方版 更新时间:2014-07-09 应用平台:/Win8/Win7/WinXP 安 ...

  7. Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)

    1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...

  8. android 小型音乐播放器(实现播放、下一首、上一首、自动播放、随机播放按钮、当前播放歌曲界面)

    该文章主要针对 android 的音乐播放器软件进行简单的功能添加:播放.断点播放.停止.上一曲.下一曲.随机播放.显示当前播放歌曲(后续会为当前显示的播放添加动画): 软件开发流程: 1.先向内存卡 ...

  9. 5kplayer(高清视频播放器) V6.0

    点击下载来源:5kplayer(高清视频播放器) V6.0 5kplayer是针对windows开发的一款优秀.全新的高清视频播放器软件,支持各类视频音频,DVD,电台等播放.这款高清视频播放器软件可 ...

  10. 关于音乐播放器中随机播放的两种模式

    众所周知,一个有完整功能的音乐播放器应该能够让用户自主选择播放模式,例如单曲循环,随机播放,列表循环,全部播放......本文主要讨论其中的随机播放,在实现随机播放的功能可以有两种方法,即random ...

最新文章

  1. 我身边那些逃离深圳的朋友们
  2. 苹果企业证书_今日更新:丨企业证书已更新丨苹果丨安卓软件下载说明丨
  3. c#将字符串转换为数组_pandas入门: 时间字符串转换为年月日
  4. Silverlight for Windows Phone 7开发体验
  5. in use 大学英语4word_2015年7月中国医科大学《大学英语4》在线作业答案
  6. spark partition
  7. Spring Boot笔记-WebSocket的使用
  8. Fellow观点:AI框架下的医疗影像教学
  9. Linux 系统之Sysvinit
  10. JAVA中super和this关键字的区别
  11. 【iOS 15】iPhone如何录屏?iPhone屏幕录制技巧分享
  12. Java web 使用页面压缩
  13. Eclipse中开发测试脚本
  14. 全方位了解8.0系统下的Handler
  15. 多线程实现飞花令-多诗库版
  16. 在火狐浏览器打开xpath_元素定位工具:火狐浏览器Try Xpath插件
  17. 新手做搭建独立站需要准备什么
  18. 寒冬,送点社区温暖。
  19. PS 图像调整算法——饱和度调整
  20. 1.2 SpringBoot构建Docker镜像并推送到Harbor

热门文章

  1. 【CDH】选定的 Parcel 正在下载并安装在群集的所有主机上 主机运行状况不良
  2. 30个打发时间的可爱网站~(太喜欢了…
  3. 1501051659-hpu-1031 【C语言训练】求素数问题.cpp
  4. SpringBoot实现定时发送邮件功能
  5. sitecore-多变量测试与A / B测试概念论述
  6. 2012年终总结----spring mvc
  7. 数据库服务器资源使用周报
  8. 自然语言处理(1)深度学习基础及其通用模板
  9. Systick滴答定时器解析
  10. 留学语言班考核成绩C,想出国留学,派笛教育告诉你GPA成绩和语言考试成绩都不能落下...