mediaplayer实现音乐播放

 

Android Podcast Code Source

出自嵌入式大讲堂
跳转到: 导航, 搜索

Android Podcast player

工程目录:

Podcastplayerdesign projectdoc.png

UI设计:

UI设计部分只做了简单修改:

  • 在TextView1下面由添加了一个TextView2
  • imageView中删除了android:src="@raw/pic"

布局效果:

Podcastplayerdesign layout.png

UI布局详细代码

工程代码

wikipodcast2.java
 package com.emsym.wikipodcast2;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
 import android.app.Activity;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.media.MediaPlayer;
 import android.media.MediaPlayer.OnCompletionListener;
 import android.net.Uri;
 import android.os.Bundle;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.ProgressBar;
 import android.widget.SeekBar;
 import android.widget.SeekBar.OnSeekBarChangeListener;
 import android.widget.TextView;

类成员定义:(有点类似全局变量定义)
   TextView mTextView;
   TextView itemTextView;
   Button startButton;
   Button pauseButton;
   Button nextButton;
   ProgressBar mProgressBar;
   SeekBar mSeekBar;
   ImageView mImageView;
   
   MediaPlayer mMediaPlayer;
   
   int mVol = 50;
   
   List<Item> itemList = new LinkedList<Item>();
   Iterator it;
在OnCreat方法中:
setContentView():显示UI布局main.xml
widgetsConfigure():实例化使用的各种窗口部件并进行相应配置(主要是设置各种事件监听器)
XMLDOM():使用DOM对xml文件进行解析
   @Override
   public void onCreate(Bundle savedInstanceState) {
   	
     String uri = "http://www.voiceblog.jp/katsuhiro/rss2.0.xml";
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
       
     widgetsConfigure();
             
     XMLDOM(uri);
     
   }
widgetsConfigure()实例化了各种窗口部件并设置事件监听器,并声明了新建了mMediaPlayer。
   public void widgetsConfigure(){
   	
   	startButton = (Button) findViewById (R.id.startButton);
       startButton.setOnClickListener(startButtonClicked);
       
       pauseButton = (Button) findViewById (R.id.pauseorcontinueButton);
       pauseButton.setOnClickListener(pauseButtonClicked);
       
       nextButton = (Button) findViewById (R.id.nextButton);
       nextButton.setOnClickListener(nextButtonClicked);
       
       mSeekBar = (SeekBar) findViewById (R.id.VolumeSeekBar);
       mSeekBar.setOnSeekBarChangeListener(mSeekBarChanged);
       
       mTextView = (TextView) findViewById (R.id.TextView1);
       mTextView.setText("Click start to play!");
       
       itemTextView = (TextView) findViewById (R.id.TextView2);
       
       mProgressBar = (ProgressBar) findViewById (R.id.MusicProgressBar);
       mImageView = (ImageView) findViewById (R.id.musicImage);
       
       mMediaPlayer = new MediaPlayer();
       
   }

startButton点击事件监听器设置
 public OnClickListener startButtonClicked = new OnClickListener(){
 
   @Override
   public void onClick(View v) {
     // TODO Auto-generated method stub
     it = itemList.iterator();
     if(it.hasNext()){
       Item ilist = (Item) it.next();
       PlayMusic(ilist);
       	
     }
   }
 };
it = itemList.iterator();构建一个链表的迭代器;
调用函数PlayMusic()来播放音乐。

mMediaPlayer播放结束事件监听器设置
 public OnCompletionListener completedPlay = new OnCompletionListener(){
   public void onCompletion(MediaPlayer arg0){
 
     PlayNext();
   }
 };
当播放结束事件被监听到时,则调用函数PlayNext()来播放下一首

函数PlayNext():播放下一首
 public void PlayNext(){
   if(it.hasNext()){
     Item ilist = (Item)it.next();
     PlayMusic(ilist);
   }else{
     it = itemList.iterator();
     Item ilist = (Item)it.next();
     PlayMusic(ilist);
   }
 }
播放下一首,首先判断itemList是否还有下一个Item,如果有,则去下一个Item播放;
如果没有,则重置迭代器(从头开始),选择第一个Item来播放

函数PlayMusic():开始播放音乐
 public void PlayMusic(Item music){
   	
   itemTextView.setText("Title: "+music.title+"\n");
   itemTextView.append("Authot: "+ music.author+"\n");
   itemTextView.append("PubDate: "+ music.pubDate+"\n");
   itemTextView.append("Duration: "+ music.duration+"\n");
   	
   Uri uri = Uri.parse(music.url);
   mMediaPlayer.reset(); //**
   try{
     mMediaPlayer.setDataSource(this, uri);
     mSeekBar.setProgress(mVol);
     mMediaPlayer.setVolume((float)(0.01*mVol), (float)(0.01*mVol));
   }catch(IllegalStateException e){
   }catch(IOException e){
   }catch(IllegalArgumentException e){
   }catch(SecurityException e){
   }
   
   try{
     mMediaPlayer.prepare();
   }catch(IOException e){
   }
   
   mMediaPlayer.start();
   mMediaPlayer.setOnCompletionListener(completedPlay);
   	
   changeProgressBar();
   	
 }
该函数的参数是Item,首先是取出Item中的各个变量,对一些变量进行显示;
然后设置播放的数据源,并调节播放音量和拖动条显示;
设置播放结束事件监听器;
调用函数changeProgressBar()来改变进度条显示;

函数changeProgressBar():新建线程负责改变进度条
 public void changeProgressBar(){
   mProgressBar.setMax(mMediaPlayer.getDuration());
   new Thread(new Runnable(){
     public void run(){
       while(true){
         mProgressBar.setProgress(mMediaPlayer.getCurrentPosition());
         try {
           Thread.sleep(1000);
         } catch (InterruptedException e) {
           // TODO Auto-generated catch block
         } 
       }
     }
   }).start();
 }
新建一个线程,根据方法getCurrentPosition()得到的结果来设置进度条的进度

pauseButton点击事件监听器设置
 public OnClickListener pauseButtonClicked = new OnClickListener(){
 
   @Override
   public void onClick(View v) {
     // TODO Auto-generated method stub
   
     if(mMediaPlayer.isPlaying()){
       mMediaPlayer.pause();
       pauseButton.setText("continue");
     }else{
       mMediaPlayer.start();
       pauseButton.setText("pause");
     }
   }	
 };

nextButton点击事件监听器设置
 public OnClickListener nextButtonClicked = new OnClickListener(){
 
   @Override
   public void onClick(View v) {
     // TODO Auto-generated method stub
     
     PlayNext();
   }  	
 };
这个的设置和播放一首结束时一样

mSeekBar改变事件监听器设置
 public OnSeekBarChangeListener mSeekBarChanged = new OnSeekBarChangeListener(){
 
   @Override
   public void onProgressChanged(SeekBar seekBar, int progress,
                                    boolean fromUser) {
     // TODO Auto-generated method stub
     		
     mVol = progress;
     mMediaPlayer.setVolume((float)(0.01*mVol), (float)(0.01*mVol));
   }
   
   @Override
   public void onStartTrackingTouch(SeekBar seekBar) {
     // TODO Auto-generated method stub
     		
   }
   
   @Override
   public void onStopTrackingTouch(SeekBar seekBar) {
     // TODO Auto-generated method stub
     		
   }
     	
 };

函数XMLDOM():对xml文件的DOM解析
 public void XMLDOM(String xmlUri){
   	
   DocumentBuilderFactory docBuilderFactory = null;
   DocumentBuilder docBuilder = null;
   Document doc = null;
   	
   String TITLE = "title";
   String IMAGE = "itunes:image";
   String ITEM = "item";
   	
   try{
     docBuilderFactory = DocumentBuilderFactory.newInstance();
     docBuilder = docBuilderFactory.newDocumentBuilder();
     doc = docBuilder.parse(xmlUri);
   	
     Element root = doc.getDocumentElement();
     //title
     Node title = root.getElementsByTagName(TITLE).item(0);
     mTextView.setText(title.getTextContent());
   	
     //image
     Node image = root.getElementsByTagName(IMAGE).item(0);
     Element elementImage = (Element) image;
     String imageUrl =elementImage.getAttribute("href");
     mImageView.setImageBitmap(GetNetBitmap(imageUrl));
   		
     //Items
     NodeList items = root.getElementsByTagName(ITEM);
     for(int i = 0;i<items.getLength();i++){
       Node item = items.item(i);
       Item music = new Item();
       NodeList elements =item.getChildNodes();
       for(int j=0;j<elements.getLength();j++){
         Node tag = elements.item(j);
         if(tag.getNodeName()!= "#text"){
           if(tag.getNodeName().equals("title")) music.title = tag.getTextContent();
           if(tag.getNodeName().equals("pubDate")) music.pubDate = tag.getTextContent();
           if(tag.getNodeName().equals("itunes:duration")) music.duration = tag.getTextContent();
           if(tag.getNodeName().equals("author")) music.author = tag.getTextContent();
           if(tag.getNodeName().equals("enclosure")){
             Element tagEnclosure = (Element) tag;
             music.url = tagEnclosure.getAttribute("url");
           }
         }
       }
       itemList.add(music);
     }
   }catch(ParserConfigurationException e){
   }catch(SAXException e){
   }catch(IOException e){
   }  	 
   	
 }
对于XML的解析,需要明确几个概念:Element,Node,NodeList,了解它们用法。详细介绍请参见XML介绍
明确了以上几个概念,相信对上述代码的理解就很容易了。

函数GetNetBitmap():获取网络图片
 public Bitmap GetNetBitmap(String url) {
   URL myFileUrl = null;
   Bitmap bitmap = null;
   try {
     myFileUrl = new URL(url);
   }catch(MalformedURLException e) {
   }
   try {
     HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
     conn.setDoInput(true);
     conn.connect();
     InputStream is = conn.getInputStream();
     bitmap = BitmapFactory.decodeStream(is);
     is.close();
   }catch(IOException e) {
   }
   return bitmap;
 }



AndroidManifest.xml

由于在程序中是用了网络,所以在AndroidManifest.xml中要添加使用网络的user-permission,使用方法:

 <uses-permission android:name="android.permission.INTERNET" />
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值