Android MP3音乐播放器总结



    经过五六天的努力,我的音乐播放器终于初步完成了,在过程中对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();
			}  
			
			}
			else
				musiclrc.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这个平台,这只是一个开始阶段的小结,以后还有更多的东西等着我去学。加油。



 

 

猜你喜欢

转载自985359995.iteye.com/blog/1916133