华为手机自带的手机本地音乐播放器器如何关联 本地lrc歌词

使用华为手机听音乐,你应该掌握的2个技巧
我的图书馆
使用华为手机听音乐,你应该掌握的2个技巧
和拍照一样,音乐功能也是我们日常使用手机体验最频繁的功能。在很多网友印象中,似乎多数手机品牌自带的音乐播放器体验都不尽人意,因此,很多人都会使用第三方音乐播放软件,如某易云音乐和企鹅音乐等。今天数码日记君要给大家说的并不是第三方播放音乐的使用技巧,而是华为手机自带的音乐播放器技巧,事实上,随着功能的不断优化,时下华为手机自带的音乐播放器功能体验可以说是相当完善,甚至不比一些第三方的音乐播放软件差。对此,下面我们就来看看,华为手机自带的音乐播放器有哪些颇为特色的功能。1、“切”歌功能此“切”歌非彼切歌,华为手机自带的音乐剪切功能,可以让你随意剪切歌曲中任何一段音乐作为铃声,操作方法很简单,点击播放界面的“×”选项,然后拖动剪切即可。2、听歌识曲功能说到这个功能,想必大家都不陌生,时下很多第三方播放器都添加支持了该功能,顾名思义,在你听到陌生歌曲时想知道歌名,开启这个功能后手机会帮助你识别出当下所听歌曲的名字,相当实用的说。操作方法:在“搜索”页面,点击“听歌识曲”功能即可。综上所述,就是华为手机自带音乐播放器的两个颇为特色的功能,对此,如果你有更多好玩的玩机技巧,欢迎添加数码日记君微信carson0701爆料哦!图:来源网络
发表评论:
TA的最新馆藏3177人阅读
android(13)
上一篇写了使用MediaPlayer播放音乐,。
代码地址:
现在来将一下加载本地歌词。好了,还是用那张图。
一,从内存卡上匹配歌词
将会从以下路径匹配
1) &SweetMusicPlayer/Lyrics/
2) &歌曲同级目录下
3) &歌曲父级目录/lryics(Lryic加不加s,首字母大小与否又分情况)
LrcContent
package com.huwei.sweetmusicplayer.
public class LrcContent {
private String lrcS //歌词内容
private int lrcT //当前歌词时间
public String getLrcStr() {
return lrcS
public void setLrcStr(String lrcStr) {
this.lrcStr = lrcS
public int getLrcTime() {
return lrcT
public void setLrcTime(int lrcTime) {
this.lrcTime = lrcT
}LrcProcess
package com.huwei.sweetmusicplayer.
import java.io.BufferedR
import java.io.F
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.IOE
import java.io.InputStreamR
import java.io.UnsupportedEncodingE
import java.util.ArrayL
import java.util.C
import java.util.L
import android.util.L
import com.parator.LrcC
import com.huwei.sweetmusicplayer.datamanager.MusicM
import com.huwei.sweetmusicplayer.util.OnlineLrcU
import com.huwei.sweetmusicplayer.util.TimeU
public class LrcProcess {
private List&LrcContent&
public LrcProcess() {
lrclists = new ArrayList&LrcContent&();
lrclists.clear();
public String loadLrc(Song song) {
String path = song.getPath();
StringBuffer stringBuffer = new StringBuffer();
// 得到歌词文件路径
String lrcPathString = path.substring(0, path.lastIndexOf(&.&))
int index = lrcPathString.lastIndexOf(&/&);
String parentP
String lrcN
// if(index!=-1){
parentPath = lrcPathString.substring(0, index);
lrcName = lrcPathString.substring(index);
File file = new File(lrcPathString);
// 匹配SweetMusicPlayer/Lyrics
if (!file.exists()) {
file = new File(OnlineLrcUtil.getInstance().getLrcPath(
song.getTitle(), song.getArtist()));
Log.i(&Path&, file.getAbsolutePath().toString());
// 匹配Lyrics
if (!file.exists()) {
file = new File(parentPath + &/../& + &Lyrics/& + lrcName);
Log.i(&Path&, file.getAbsolutePath().toString());
// 匹配lyric
if (!file.exists()) {
file = new File(parentPath + &/../& + &lyric/& + lrcName);
Log.i(&Path&, file.getAbsolutePath().toString());
// 匹配Lyric
if (!file.exists()) {
file = new File(parentPath + &/../& + &Lyric/& + lrcName);
Log.i(&Path&, file.getAbsolutePath().toString());
// 匹配lyrics
if (!file.exists()) {
file = new File(parentPath + &/../& + &lyrics/& + lrcName);
Log.i(&Path&, file.getAbsolutePath().toString());
if (!file.exists()) {
stringBuffer.append(MusicManager.OperateState.READLRCFILE_FAIL);
return stringBuffer.toString();
FileInputStream fin = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fin, &utf-8&);
BufferedReader br = new BufferedReader(isr);
boolean isLrc =
while ((s = br.readLine()) != null) {
// if(isLrc){
s = s.replace(&[&, &&); // 去掉左边括号
String lrcData[] = s.split(&]&);
// 这句是歌词
if (lrcData[0].matches(&^\\d{2}:\\d{2}.\\d+$&)) {
int len = lrcData.
int end = lrcData[len - 1].matches(&^\\d{2}:\\d{2}.\\d+$&) ? len
: len - 1;
for (int i = 0; i & i++) {
LrcContent lrcContent = new LrcContent();
int lrcTime = TimeUtil.getLrcMillTime(lrcData[i]);
lrcContent.setLrcTime(lrcTime);
if (lrcData.length == end)
lrcContent.setLrcStr(&&); // 空白行
lrcContent.setLrcStr(lrcData[len - 1]);
lrclists.add(lrcContent);
// 按时间排序
Collections.sort(lrclists, new LrcComparator());
if (lrclists.size() == 0) {
stringBuffer.append(MusicManager.OperateState.READLRC_LISTNULL);
stringBuffer.append(MusicManager.OperateState.READLRC_SUCCESS);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// stringBuffer.append(&未找到歌词文件&);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// stringBuffer.append(&不支持的编码&);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// stringBuffer.append(&IO错误&);
return stringBuffer.toString();
public List&LrcContent& getLrclists() {
二,歌词解析
先摘取一段歌词
[ar:周杰伦]
[al:范特西]
[by:Midas]
[00:03.16]&
[00:04.50]周杰伦-安静
[00:14.50]词:周杰伦 曲:周杰伦 编:钟兴民
[00:25.17] &
[02:27.48][00:27.02]只剩下钢琴陪我谈了一天
[02:32.76][00:32.51]睡着的大提琴 安静的旧旧的
[02:39.60][00:38.67]&
[02:40.74][00:40.48]我想你已表现的非常明白
[02:46.04][00:45.7]我懂我也知道 你没有舍不得
[02:53.23][00:52.53]&
[02:54.04][00:53.76]你说你也会难过我不相信
[03:00.59][01:00.36]牵着你陪着我 也只是曾经
[03:06.63][01:06.24]希望他是真的比我还要爱你
[03:13.29][01:12.96]我才会逼自己离开
每次遍历一行,首先要把“[”替换成& &,去匹配哪些是时间部分,正则匹配“^\\d{2}:\\d{2}.\\d+$”,然后split(&]&),得到一个数组data[],最后一个是内容,前面是歌词,遍历数组,装入时间歌词到list。
时间处理:转成毫秒
遍历所有行后,对list按照时间排序。
代码在上面LrcProgress。
三,LrcView控件
分为以下状态:
public static String READLRC_SUCCESS=&READLRC_SUCCESS&;//读取本地歌词成功
public static String READLRC_LISTNULL=&READLRC_LISTNULL&;//读取歌词list为null
public static String READLRC_ONLINE=&READLRC_ONLINE&;//正在从网络加载歌词
public static String READLRCFILE_FAIL=&READLRCFILE_FAIL&;//读取歌词文件失败
public static String READLRCONLINE_FAIL=&READLRCONLINE_FAIL&;//从网络加载歌词失败
根据不同的状态绘制不同的内容。
LrcView继承自ScrollView,然后再加一层LinearLayout,歌词绘制在TextView上,按照播放时间滚动,就可以保证当前播放的歌词在屏幕中间了。
关于自定义控件,要注意对onMeasure(),onLayout(),onDraw()比较好的理解,有时候遇到onDraw()不能执行,记得加上setWillNotDraw(false),这里直接继承自ScrollView,就不需要考虑那么多了。
这里需要根据播放时间计算当前播放位置,歌词所在行,然后不同的时候,就去更新歌词界面。
调整歌词进度:
触摸监听时,ACTION_MOVE去绘制歌词进度预览(包括调整到的时间预览),ACTION_UP时调整到对应的进度。
package com.huwei.sweetmusicplayer.ui.
import java.util.L
import com.huwei.sweetmusicplayer.datamanager.MusicM
import com.huwei.sweetmusicplayer.models.LrcC
import com.huwei.sweetmusicplayer.util.TimeU
import android.content.C
import android.content.I
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.T
import android.os.H
import android.os.M
import android.util.AttributeS
import android.util.L
import android.view.MotionE
import android.view.V
import android.view.ViewTreeObserver.OnScrollChangedL
import android.widget.ScrollV
import android.widget.TextV
import android.view.View.OnTouchL
public class LrcView extends ScrollView implements OnScrollChangedListener,OnTouchListener{
//歌词视图宽度
//歌词视图高度
private Paint currentP
//当前画笔对象
private Paint notCurrentP
//非当前画笔对象
private final float textHeight=40; //文本高度
private final float textSize=36;
//高亮文本大小
private final float notTextSize=30;
//非高亮文本大小
//歌词list集合下标
private String lrcS
private LrcTextView lrcTextV
private List&LrcContent& lrcL
private int scrollY;
private boolean canDrawLine=
private int pos=-1; //手指按下后歌词要到的位置
private Paint lineP
private boolean canTouchLrc=
//是否可以触摸并调整歌词
private int count=0;
//绘制加载点的次数
private Context mC
public LrcView(Context context) {
this(context,null);
// TODO Auto-generated constructor stub
public LrcView(Context context, AttributeSet attrs) {
this(context, attrs,0);
// TODO Auto-generated constructor stub
public LrcView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
this.setOnTouchListener(this);
public List&LrcContent& getLrcLists() {
return lrcL
public void setLrcLists(List&LrcContent& lrcLists) {
this.lrcLists = lrcL
//判断歌词界面是否可以触摸
if(lrcLists==null||lrcLists.size()==0) canTouchLrc=
else canTouchLrc=
//设置index=-1
this.index=-1;
LayoutParams params1=new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
lrcTextView=new LrcTextView(this.getContext());
lrcTextView.setLayoutParams(params1);
this.removeAllViews();
this.addView(lrcTextView);
public int getIndex() {
public void setIndex(int index) {
//歌曲位置发生变化,而且手指不是调整歌词位置的状态
if(this.index!=index&&pos==-1){
this.scrollTo(0, (int)(index*textHeight));
this.index =
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
super.onSizeChanged(w, h, oldw, oldh);
this.width=w;
this.height=h;
public int getIndexByLrcTime(int currentTime){
for(int i=0;i&lrcLists.size();i++){
if(currentTime&lrcLists.get(i).getLrcTime()){
return i-1;
return lrcLists.size()-1;
public void clear(){
public String getLrcState() {
return lrcS
public void setLrcState(String lrcState) {
this.lrcState = lrcS
this.invalidate();
LrcTextView extends TextView{
public LrcTextView(Context context) {
this(context,null);
// TODO Auto-generated constructor stub
public LrcTextView(Context context, AttributeSet attrs) {
this(context, attrs,0);
// TODO Auto-generated constructor stub
public LrcTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
this.setWillNotDraw(false);
//绘制歌词
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
Log.i(&LrcTextView onDraw&,&LrcTextView onDraw&);
if(canvas==null)
int tempY=(int) height/2;
if(MusicManager.OperateState.READLRC_LISTNULL.equals(lrcState)){
canvas.drawText(&歌词内容为空&, width/2, tempY, notCurrentPaint);
}else if(MusicManager.OperateState.READLRCFILE_FAIL.equals(lrcState)){
canvas.drawText(&未找到歌词文件&, width/2, tempY, notCurrentPaint);
else if(MusicManager.OperateState.READLRC_SUCCESS.equals(lrcState)){
//绘制歌词
for(int i=0;i&lrcLists.size();i++,tempY+=textHeight){
if(i==index){
canvas.drawText(lrcLists.get(i).getLrcStr(), width/2, tempY, currentPaint);
}else if(i==pos){
canvas.drawText(lrcLists.get(i).getLrcStr(), width/2, tempY, linePaint);
canvas.drawText(lrcLists.get(i).getLrcStr(), width/2, tempY, notCurrentPaint);
}else if(MusicManager.OperateState.READLRC_ONLINE.equals(lrcState)){
String drawContentStr=&在线匹配歌词&;
for(int i=0;i&i++){
drawContentStr+=&.&;
if(count&=6) count=0;
canvas.drawText(drawContentStr, width/2, tempY, notCurrentPaint);
handler.sendEmptyMessageDelayed(1, 500);
}else if(MusicManager.OperateState.READLRCONLINE_FAIL.equals(lrcState)){
canvas.drawText(&从网络加载歌词失败&, width/2, tempY, notCurrentPaint);
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
heightMeasureSpec=(int) (height+textHeight*(lrcLists.size()-1));
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if(canDrawLine){
canvas.drawLine(0, scrollY+height/2, width, scrollY+height/2, linePaint);
canvas.drawText(TimeUtil.toTime(lrcLists.get(pos).getLrcTime()), 42, scrollY+height/2-2, linePaint);
private void init(){
setFocusable(true); //设置该控件可以有焦点
this.setWillNotDraw(false);
//高亮歌词部分
currentPaint=new Paint();
currentPaint.setAntiAlias(true); //设置抗锯齿
currentPaint.setTextAlign(Paint.Align.CENTER); //设置文本居中
//非高亮歌词部分
notCurrentPaint=new Paint();
notCurrentPaint.setAntiAlias(true);
notCurrentPaint.setTextAlign(Paint.Align.CENTER);
linePaint=new Paint();
linePaint.setAntiAlias(true);
linePaint.setTextAlign(Paint.Align.CENTER);
//设置画笔颜色
currentPaint.setColor(Color.argb(210, 251, 248, 29));
notCurrentPaint.setColor(Color.argb(140, 255, 255, 255));
linePaint.setColor(Color.RED);
currentPaint.setTextSize(textSize);
currentPaint.setTypeface(Typeface.SERIF);
notCurrentPaint.setTextSize(notTextSize);
notCurrentPaint.setTypeface(Typeface.DEFAULT);
linePaint.setTextSize(textSize);
linePaint.setTypeface(Typeface.SERIF);
public void invalidate() {
// TODO Auto-generated method stub
super.invalidate();
lrcTextView.invalidate();
public void onScrollChanged() {
// TODO Auto-generated method stub
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
//界面不能被触摸
if(!canTouchLrc)
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
scrollY=this.getScrollY();
pos=(int) (this.getScrollY()/textHeight);
canDrawLine=
this.invalidate();
Log.i(&LrcView&, &ACTION_DOWN&);
case MotionEvent.ACTION_UP:
MusicManager.getInstance().setProgress(lrcLists.get(pos).getLrcTime());
canDrawLine=
this.invalidate();
private Handler handler=new Handler(){
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
invalidate();
下一篇智能匹配在线歌词:&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:50369次
积分:1111
积分:1111
排名:千里之外
原创:48篇
评论:70条
阅读:15459
(1)(2)(1)(1)(1)(2)(1)(3)(2)(1)(7)(9)(1)(10)(3)(2)(1)(1)(2)(2)(1)(1)(2)&&&&一个很强大的音乐播放器有同步显示歌词和读取本地音乐
&一个很强大的音乐播放器有同步显示歌词和读取本地音乐
一个很强大的音乐播放器有同步显示歌词和读取本地音乐
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
移动开发下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
一个很强大的音乐播放器有同步显示歌词和读取本地音乐
所需积分:5
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
一个很强大的音乐播放器有同步显示歌词和读取本地音乐
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员后使用快捷导航没有帐号?
平板/笔记本
mate7自带音乐播放器如何调整播放列表里歌曲的排列顺序
&略有小成&
来自:浏览器
如题,求大神解答,谢谢
width:100%">
&登堂入室&
来自:浏览器
全部删除,重新按次序下载。
width:100%">
&略有小成&
来自:浏览器
zds 发表于
全部删除,重新按次序下载。
但是下载后用手机本地歌曲创建的播放列表貌似是按歌名首字母排列的
width:100%">
&已臻大成&
来自:浏览器
但是下载后用手机本地歌曲创建的播放列表貌似是按歌名首字母排列的
华为音乐确实是首字母排列的
width:100%">
&已臻大成&
来自:浏览器
楼主您好,自带的音乐播放器是按首字母排序的。
width:100%">
&登堂入室&
来自:浏览器
原来没注意这个问他,现在发现,这还真是没办法了,也懒得鼓捣,我提个建议,你可以下载个其它音乐软件比如qq音乐,然后在文件管理器里把所有歌的名字前面加个字母,当然按先后顺序,我没有时间操作,你试下
width:100%">
&禁止发言&
来自:浏览器
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
width:100%">
&略有小成&
来自:浏览器
zds 发表于
原来没注意这个问他,现在发现,这还真是没办法了,也懒得鼓捣,我提个建议,你可以下载个其它音乐软件比如 ...
不错的建议,谢谢
width:100%">
申请成为热心花粉,满足热心花粉条件即可获得!http://cn./forum.php?mod=viewthread&tid=183642
1000万花粉
纪念花粉俱乐部注册花粉数超过1000万
【西塘印象】【家有一宝】【第一场雪】【冬日无锡】【花溪游记】【公园晨景】
花粉客户端
Make it Possible
Make your device special
华为云服务
Huawei cloud services
音乐播放器
Huawei Music
Huawei Vmall
没有最新动态
关注花粉俱乐部
联系我们:
|关注花粉俱乐部:
Copyright (C)
华为软件技术有限公司 版权所有 保留一切权利

我要回帖

更多关于 华为音乐播放器 lrc 的文章

 

随机推荐