经过五六天的努力,我的音乐播放器终于初步完成了,在过程中对Android有了进一步的了解。以下是我的播放器实现的功能:

1.上一曲,下一曲,随机播放 2.暂停,播放

3.时间,进度条随歌曲播放改变 4.歌词歌名的显示

5.来电暂停,挂断继续 6.实现后台播放

7.能遍历内存卡所有歌曲并显示出歌曲信息

8.界面的跳转 9.实现摇晃一下换歌

下面介绍一下其中的几个功能:

一. 歌词的实现

1.首先是从内出卡获取歌词

遍历内存卡,将文件都取出在判断文件类型,将包含.lrc的文件的信息保存到一个list容器中创建一个file对象,获取当前歌曲的歌词信息

//获取歌词public void findlrc(String path){      //创建一个file对象       File file=new File(path);        if(file.exists()){                if(file.isFile()){                       if(file.getName().contains(".lrc")){           //获取后缀为lrc的文件                           String s=file.getAbsolutePath();                    Map<String,Object> map=new HashMap<String,Object>();                   map.put("url",s );                   map.put("title", file.getName().substring(0, file.getName().length()-".lrc".length()));                      list_lrc.add(map);                     }      }            else if(file.isDirectory()){                                //如果是文件夹,就要遍历文件夹下的所有文件或目录                //创建一个File数组                File[] files=file.listFiles();                if(files!=null){                                       for(File f:files){                                            //递归调用自身                         findlrc(f.getAbsolutePath());                   }               }            }       }  }

2.将当前所选歌曲的歌词获取

将当前歌曲名到list中寻找与之匹配的title;若有匹配的这将歌词文件封装成文件流,再调用readLine()方法按行读取,并将文件前端的时间信息分离出来保存到time_list中(要转换格式)。否则显示“歌词不存在”

public void song(){for(int i=0;i<PlayMusicActivity.list_lrc.size();i++){String lrc_title=(String) list_lrc.get(i).get("title");String lrc_url=(String) list_lrc.get(i).get("url");if(lrc_title.equals(title))   //如果lrc_title中包含了当前歌曲名,则表示该歌曲有歌词//System.out.println("================"+title);{File file=new File(lrc_url); FileInputStream fis;try {    //将歌词封装成流fis = new FileInputStream(file);InputStreamReader is=new InputStreamReader(fis);                  BufferedReader br=new BufferedReader(is);               while((line=br.readLine())!=null)  //读取流               {                                String time=line.substring(0, line.indexOf("]")+1);            //因为在歌词中,时间都是放在一对【】中,所以要把时间取出来                                time=time.replace("[", "");     //歌词中时间的格式是mm:ss.xx,所以要把:和.代替掉,                  time=time.replace("]", "");           time=time.replace(".", ":");   //在这里不能写成time=time.replace(":", ".");因为‘.’会转义          lrc_time=time.split(":");      //分离时间               line=line.substring(line.indexOf("]")+1);       if(lrc_time.length==3){      Map<String,String> map=new HashMap<String,String>();        map.put("time",lrc_time[0]+":"+lrc_time[1]);        map.put("line",line);       time_list.add(map);                System.out.println(line);       }               }               } catch (Exception e) {e.printStackTrace();}  }elsemusiclrc.setText("歌词不存在"); }}

3.实现歌词的同步

因为在歌词文件中没句歌词都有对应的时间,我们只需要将歌词的时间与当前播放时间比较,若相同则显示对应的歌词。

for(final Map<String, String> t:time_list){        String str = t.get("time");    //获取歌词时间                    if(s.equals(str)){  //如果当前时间与歌词时间相等则输出歌词          musiclrc.post(new Runnable(){     public void run(){      musiclrc.setText(t.get("line"));       }       });     }  }  
  

二.来电暂停,挂断播放

这实际就是添加一个对电话状态的监听,在这个监听接口中有各种抽象方法,我们只需要在相应的方法中对歌曲播放状态进行设置即可。

 //  实现接电话暂停,挂电话开始功能  tmanger=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);PhoneStateListener phone_listener=new PhoneStateListener(){public void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);switch(state){case TelephonyManager.CALL_STATE_OFFHOOK:  //摘机mp.pause();     break;case TelephonyManager.CALL_STATE_RINGING:  //接通电话mp.pause();break;case TelephonyManager.CALL_STATE_IDLE:   //无活动mp.start();break;}}};tmanger.listen(phone_listener, PhoneStateListener.LISTEN_CALL_STATE); //监听打电话的状态}

在这几天的Android学习中学到了很多。不管是敲代码还是其他方面,很重要的一点是,我们要自己专研才会学到跟多东西。别人讲的我们只是听了一遍,其中的内涵还要我们不断实践,查阅资料才能理解深刻,才能学会运用。通过这几天的学习,我也开始喜欢Android这个平台,这只是一个开始阶段的小结,以后还有更多的东西等着我去学。加油。





更多相关文章

  1. 如果你现在学Android---学习使用Kotlin进行Android开发
  2. Android初步
  3. Android(安卓)NDK开发篇(一) windows免cygwin搭建ndk环境
  4. android sqlite 介绍
  5. Android(安卓)Jni代码示例讲解
  6. Android动态换肤(二、apk免安装插件方式)
  7. 格式化字符串android 格式化时间
  8. Android(安卓)自动检测版本并升级
  9. linux学习笔记《一.烧写篇_android》

随机推荐

  1. Android NotificationChannel
  2. Android onTouch事件解析
  3. Edittext在xml文件中设置android:focusabl
  4. iOS与Android的对比
  5. Android中Failed to 。。。。。。timeout
  6. 【经验记录】Android上传文件到服务器
  7. Android:Deprecated Thread methods are
  8. Android之四大组件解析
  9. 开源项目之Android DataFramework(数据库
  10. Android NDK开发学习(三)