MP3播放器项目---编写代码---6
1. Mp3ListActivity
package hui.mp3player;
import hui.download.HttpDownloader;
import hui.model.Mp3Info;
import hui.xml.Mp3ListContentHandler;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.SAXParserFactory;
import hui.mp3player.R;
import hui.download.*;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import hui.mp3player.*;
import android.R.xml;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class Mp3ListActivity extends ListActivity {
private static final int UPDATE = 1;
private static final int ABOUT = 2;
private List<Mp3Info> mp3Infos = null;
private static final String XML_URL=null;
/**
* 在用点击MENU按钮之后,会调用该方法,我们可以在这个方法当中加入自己的按钮控件
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add(0, UPDATE, 1, R.string.mp3list_update);
menu.add(0, ABOUT, 2, R.string.mp3list_about);
return super.onCreateOptionsMenu(menu);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.remote_mp3_list);
updateListView();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == UPDATE) {
updateListView();
} else if (item.getItemId() == ABOUT) {
// 用户点击了关于按钮
}
return super.onOptionsItemSelected(item);
}
private SimpleAdapter buildSimpleAdapter(List<Mp3Info> mp3Infos) {
// 生成一个List对象,并按照SimpleAdapter的标准,将mp3Infos当中的数据添加到List当中去
List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
Mp3Info mp3Info = (Mp3Info) iterator.next();
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("mp3_name", mp3Info.getMp3Name());
map.put("mp3_size", mp3Info.getMp3Size());
map.put("mp3_icon", R.drawable.kky);
//map.put("mp3_icon", R.drawable.i2);
//map.put("mp3_icon", R.drawable.i3);
list.add(map);
}
// 创建一个SimpleAdapter对象
SimpleAdapter simpleAdapter = new SimpleAdapter(this, list,
R.layout.mp3info_item, new String[] { "mp3_name", "mp3_size","mp3_icon" },
new int[] { R.id.mp3_name, R.id.mp3_size,R.id.mp3_icon });
// 将这个SimpleAdapter对象设置到ListActivity当中
return simpleAdapter;
}
private void updateListView() {
// 用户点击了更新列表按钮
// 下载包含所有Mp3基本信息的xml文件
String xml = downloadXML("http://192.168.1.2:8080/myapp/11.xml");
// 对xml文件进行解析,并将解析的结果放置到Mp3Info对象当中,最后将这些Mp3Info对象放置到List当中
mp3Infos = parse(xml);
SimpleAdapter simpleAdapter = buildSimpleAdapter(mp3Infos);
setListAdapter(simpleAdapter);
}
private String downloadXML(String urlStr) {
HttpDownloader httpDownloader = new HttpDownloader();
String result = httpDownloader.download(urlStr);
return result;
}
private List<Mp3Info> parse(String xmlStr) {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
List<Mp3Info> infos = new ArrayList<Mp3Info>();
try {
URL url=new URL("http://192.168.1.2:8080/myapp/11.xml");
//System.out.print("url-------"+url);
//Mp3Info mp3info = new Mp3Info();
//Mp3Info mp3Info1 = mp3Info1.getMp3Name();
//String uriStr=XML_URL+URLEncoder.encode(mp3Info1.getMp3Name(),"UTF-8");
//URL url=new URL(uriStr);
XMLReader xmlReader = saxParserFactory.newSAXParser()
.getXMLReader();
Mp3ListContentHandler mp3ListContentHandler = new Mp3ListContentHandler(
infos);
xmlReader.setContentHandler(mp3ListContentHandler);
InputStreamReader isr =new InputStreamReader(url.openStream(),"GB2312");
//StringReader stringReader = new StringReader(resultStr);
InputSource inputSource = new InputSource(isr);
//StringReader stringReader = new StringReader(xmlStr);
//InputSource inputSource = new InputSource(stringReader);
xmlReader.parse(inputSource);
for (Iterator iterator = infos.iterator(); iterator.hasNext();) {
Mp3Info mp3Info = (Mp3Info) iterator.next();
System.out.println("显示111-------"+mp3Info);
}
} catch (Exception e) {
e.printStackTrace();
}
return infos;
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// 根据用户点击列表当中的位置来得到响应的Mp3Info对象
Mp3Info mp3Info = mp3Infos.get(position);
// 生成Intent对象
Intent intent = new Intent();
System.out.print("点击-----"+ mp3Info);
// 将Mp3Info对象存入到Intent对象当中
intent.putExtra("mp3Info", mp3Info);
intent.setClass(this, DownloadService.class);
// 启动Service
startService(intent);
super.onListItemClick(l, v, position, id);
}
}
2.PlayerActivity
package hui.mp3player;
import hui.lrc.LrcProcessor;
import hui.model.Mp3Info;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Queue;
import hui.mp3player.R;
import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
public class PlayerActivity extends Activity {
ImageButton beginButton = null;
ImageButton pauseButton = null;
ImageButton stopButton = null;
MediaPlayer mediaPlayer = null;
private ArrayList<Queue> queues = null;
private TextView lrcTextView = null;
private Mp3Info mp3Info = null;
private Handler handler = new Handler();
private UpdateTimeCallback updateTimeCallback = null;
private long begin = 0;
private long nextTimeMill = 0;
private long currentTimeMill = 0;
private String message = null;
private long pauseTimeMills = 0;
private boolean isPlaying = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.player);
Intent intent = getIntent();
mp3Info = (Mp3Info) intent.getSerializableExtra("mp3Info");
beginButton = (ImageButton) findViewById(R.id.begin);
pauseButton = (ImageButton) findViewById(R.id.pause);
stopButton = (ImageButton) findViewById(R.id.stop);
beginButton.setOnClickListener(new BeginButtonListener());
pauseButton.setOnClickListener(new PauseButtonListener());
stopButton.setOnClickListener(new StopButtonListener());
lrcTextView = (TextView)findViewById(R.id.lrcText);
}
/**
* 根据歌词文件的名字,来读取歌词文件当中的信息
* @param lrcName
*/
private void prepareLrc(String lrcName){
try {
InputStream inputStream = new FileInputStream(Environment.getExternalStorageDirectory().getAbsoluteFile() +File.separator + "mp3/" + mp3Info.getLrcName());
LrcProcessor lrcProcessor = new LrcProcessor();
queues = lrcProcessor.process(inputStream);
//创建一个UpdateTimeCallback对象
updateTimeCallback = new UpdateTimeCallback(queues);
begin = 0 ;
currentTimeMill = 0 ;
nextTimeMill = 0 ;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
class BeginButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
//创建一个Intent对象,用于同时Service开始播放MP3
Intent intent = new Intent();
intent.setClass(PlayerActivity.this, PlayerService.class);
intent.putExtra("mp3Info", mp3Info);
intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);
//读取LRC文件
prepareLrc(mp3Info.getLrcName());
//启动Service
startService(intent);
//将begin的值置为当前毫秒数
begin = System.currentTimeMillis();
//执行updateTimeCallback
handler.postDelayed(updateTimeCallback, 5);
isPlaying = true;
}
}
class PauseButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
//通知Service暂停播放MP3
Intent intent = new Intent();
intent.setClass(PlayerActivity.this, PlayerService.class);
intent.putExtra("MSG", AppConstant.PlayerMsg.PAUSE_MSG);
startService(intent);
//
if(isPlaying){
handler.removeCallbacks(updateTimeCallback);
pauseTimeMills = System.currentTimeMillis();
}
else{
handler.postDelayed(updateTimeCallback, 5);
begin = System.currentTimeMillis() - pauseTimeMills + begin;
}
isPlaying = isPlaying ? false : true;
}
}
class StopButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
//通知Service停止播放MP3文件
Intent intent = new Intent();
intent.setClass(PlayerActivity.this, PlayerService.class);
intent.putExtra("MSG", AppConstant.PlayerMsg.STOP_MSG);
startService(intent);
//从Handler当中移除updateTimeCallback
handler.removeCallbacks(updateTimeCallback);
}
}
class UpdateTimeCallback implements Runnable{
Queue times = null;
Queue messages = null;
public UpdateTimeCallback(ArrayList<Queue> queues) {
//从ArrayList当中取出相应的对象对象
times = queues.get(0);
messages = queues.get(1);
}
@Override
public void run() {
//计算偏移量,也就是说从开始播放MP3到现在为止,共消耗了多少时间,以毫秒为单位
long offset = System.currentTimeMillis() - begin;
if(currentTimeMill == 0){
nextTimeMill = (Long)times.poll();
message = (String)messages.poll();
}
if(offset >= nextTimeMill){
lrcTextView.setText(message);
message = (String)messages.poll();
nextTimeMill = (Long)times.poll();
}
currentTimeMill = currentTimeMill + 10;
handler.postDelayed(updateTimeCallback, 10);
}
}
}
3.PlayerService
package hui.mp3player;
import hui.lrc.LrcProcessor;
import hui.model.Mp3Info;
import hui.mp3player.AppConstant;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Queue;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Environment;
import android.os.IBinder;
public class PlayerService extends Service {
private boolean isPlaying = false;
private boolean isPause = false;
private boolean isReleased = false;
private MediaPlayer mediaPlayer = null;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Mp3Info mp3Info = (Mp3Info) intent.getSerializableExtra("mp3Info");
int MSG = intent.getIntExtra("MSG", 0);
if (mp3Info != null) {
if(MSG == AppConstant.PlayerMsg.PLAY_MSG){
play(mp3Info);
}
} else {
if(MSG == AppConstant.PlayerMsg.PAUSE_MSG){
pause();
}
else if(MSG == AppConstant.PlayerMsg.STOP_MSG){
stop();
}
}
return super.onStartCommand(intent, flags, startId);
}
private void play(Mp3Info mp3Info) {
String path = getMp3Path(mp3Info);
mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + path));
mediaPlayer.setLooping(false);
mediaPlayer.start();
isPlaying = true;
isReleased = false;
}
private void pause() {
if (mediaPlayer != null) {
if (!isReleased) {
if (!isPause) {
mediaPlayer.pause();
isPause = true;
isPlaying = true;
} else {
mediaPlayer.start();
isPause = false;
}
}
}
}
private void stop() {
if (mediaPlayer != null) {
if (isPlaying) {
if (!isReleased) {
mediaPlayer.stop();
mediaPlayer.release();
isReleased = true;
}
isPlaying = false;
}
}
}
private String getMp3Path(Mp3Info mp3Info) {
String SDCardRoot = Environment.getExternalStorageDirectory()
.getAbsolutePath();
String path = SDCardRoot + File.separator + "mp3" + File.separator
+ mp3Info.getMp3Name();
return path;
}
}
上个图------很丑---UI搞得很辛苦所以放弃了,弄下天气的程序