package yin.mp3player;
import java.io.File;
import java.util.List;
import yin.mp3player.service.IPlayer;
import yin.mp3player.service.PlayerService;
import yin.tools.FileTools;
import yin.tools.StringTools;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
public class Mp3PlayUIActivity extends Activity implements OnClickListener{
//声明变量
private IPlayer playerService;
private Mp3PlayerApp app; //全局变量对象
private Button btnPlay;
private SeekBar seekBar;
private TextView currentTime,totalTime,tvMp3Name,tvSinger,tvLrc;
private final int UPDATESEEKBAR = 0; //用于MSG标志,更新进度条
private final int UPDATETITLE = 1; //msg标志,更新歌曲信息
private final int UPDATELRC = 2; //msg标志,更新歌词显示
private final int LRCERROR = 3; //msg标志,读取lrc文件错误
private boolean isUpdateSeekBar = false; //是否更新进度条
private boolean isUpdateLrc = false; //是否更新歌词
private String currentMp3Name = null; //保存当前播放的mp3名称
private List<Long> Times; //lrc时间点列表,从小到大排序
private List<String> Contents; //时间点对应的歌词列表
private LrcParse lrc = new LrcParse(); //lrc文件解析类对象
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mp3_play_ui);
System.out.println("onCreate"+Thread.currentThread().getId());
//初始化试图
InitView();
//链接Service
ConnectionPlayerService();
}
// 创建Handler对象用来更新UI
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case UPDATESEEKBAR:
UpdateSeekBar();
break;
case UPDATETITLE:
UpdateTitle();
break;
case UPDATELRC:
tvLrc.setText(Contents.get(msg.arg1));
break;
case LRCERROR:
UpdateTitle();
tvLrc.setText("歌词文件错误!");
break;
}
//System.out.println("handleMessage"+Thread.currentThread().getId());
}
};
/**
* 初始化控件
*/
private void InitView(){
//得到全局变量实例对象
app = (Mp3PlayerApp) this.getApplication();
//将mp3文件夹里面的mp3文件名保存到全局变量中
app.setMp3Names(new FileTools().GetMp3NamesFromSD("mp3", ".mp3"));
findViewById(R.id.btn_last).setOnClickListener(this);
btnPlay = (Button)findViewById(R.id.btn_play);
btnPlay.setOnClickListener(this);
findViewById(R.id.btn_next).setOnClickListener(this);
tvMp3Name = (TextView)findViewById(R.id.tv_mp3name);
tvSinger = (TextView)findViewById(R.id.tv_singer);
tvLrc = (TextView)findViewById(R.id.tv_lrc);
currentTime = (TextView)findViewById(R.id.tv_currenttime);
totalTime = (TextView)findViewById(R.id.tv_totaltime);
seekBar = (SeekBar)findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(playerService == null)
return;
try {
if(!playerService.isPlaying())
return;
playerService.seekPosition(seekBar.getProgress()*playerService.getDuration()/seekBar.getMax());
}
catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
}
@Override
public void onClick(View v) {
if(playerService == null)
return;
int id = v.getId();
try {
//将播放列表同步到Service
playerService.SetMp3Names(app.getMp3Namse());
} catch (RemoteException e) {
e.printStackTrace();
}
switch(id){
case R.id.btn_last:
Last();
break;
case R.id.btn_play:
PlayBtnOnClick();
break;
case R.id.btn_next:
Next();
break;
}
}
/**
* 更新播放进度条及时间
*/
private void UpdateSeekBar(){
if(isUpdateSeekBar == false)
return;
if(playerService == null)
return;
try {
int currenttime = playerService.getCurrentPosition();
int totaltime = playerService.getDuration();
//更新进度条
seekBar.setProgress(currenttime*seekBar.getMax()/totaltime);
//更新当前时间
currentTime.setText(StringTools.StringToTime(currenttime));
//更新总时长
totalTime.setText(StringTools.StringToTime(totaltime));
}
catch (RemoteException e) {
e.printStackTrace();
}
//该操作不会阻塞线程
handler.sendMessageDelayed(handler.obtainMessage(UPDATESEEKBAR),300);
}
private void UpdateTitle(){
tvMp3Name.setText(lrc.getTitle());
tvSinger.setText(lrc.getSinger());
}
/**
* 开启一个线程用来更新歌词
*/
class UpdateLrc implements Runnable{
private int currentIndex = -1;
@Override
public void run() {
while(isUpdateLrc){
String strtemp = null;
try{
strtemp = playerService.getMp3Name();
}
catch(RemoteException e){
e.printStackTrace();
}
if(strtemp != currentMp3Name){
currentMp3Name = strtemp;
//读取Lrc文件
System.out.println(strtemp.replace(".mp3", ".lrc"));
String lrcpath = Environment.getExternalStorageDirectory().
getAbsolutePath() +File.separator+"mp3"+File.separator+
strtemp.replace(".mp3", ".lrc");
System.out.println(lrcpath);
if(lrc.Parse(lrcpath) == false){
//发送消息
handler.sendMessage(handler.obtainMessage(LRCERROR));
isUpdateLrc = false;
return;
}
//获得时间点列表和歌词列表
Times = lrc.getTimes();
Contents = lrc.getContents();
//发送消息更新歌手、歌题等信息
handler.sendMessage(handler.obtainMessage(UPDATETITLE));
}
try {
int currenttime = playerService.getCurrentPosition();
int centerIndex = Times.size()/2;
int i = 0;
//当前时间大于等于列表的中间值
if(currenttime >= Times.get(centerIndex)){
i = centerIndex;
}
for(;i<Times.size()-1;i++){
if((currenttime >= Times.get(i)) && (currenttime < Times.get(i+1))){
//当前歌词到下条歌词有一段时间,没跳出这段时间则不需要发送消息
if(i != currentIndex){
currentIndex = i;
//将歌词索引发送给UI线程
Message msg = handler.obtainMessage(UPDATELRC);
msg.arg1 = i;
handler.sendMessage(msg);
break;
}
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
/**
* 播放按钮被点击时
*/
private void PlayBtnOnClick(){
//播放列表为空
if(0 == app.getMp3Namse().size()){
Toast.makeText(this,"播放列表为空,请添加音乐!", Toast.LENGTH_LONG).show();
return;
}
try {
if(playerService.isPlaying()){
btnPlay.setBackgroundResource(R.drawable.btn_play_bg);
isUpdateSeekBar = false;
isUpdateLrc = false;
}
else{
btnPlay.setBackgroundResource(R.drawable.btn_pause_bg);
isUpdateSeekBar = true;
//开启线程更新歌词
isUpdateLrc = true;
new Thread(new UpdateLrc()).start();
}
playerService.Start();
}
catch (RemoteException e) {
e.printStackTrace();
}
//更新进度条
UpdateSeekBar();
}
/**
* 播放下一首
*/
private void Next(){
if(false == isUpdateSeekBar )
return;
try {
playerService.Next();
}
catch (RemoteExceptio
没有合适的资源?快使用搜索试试~ 我知道了~
Android Mp3Player,整个程序打包,解压后可直接导入eclipse
共99个文件
class:39个
png:19个
xml:16个
5星 · 超过95%的资源 需积分: 10 186 下载量 51 浏览量
2011-07-30
12:03:24
上传
评论 4
收藏 296KB RAR 举报
温馨提示
http://blog.csdn.net/yinyuping/article/details/6634263在这里可以看到截图和相关的介绍。因为时间原因,本代码没做过多的整理!对代码有疑问或不明白的地方可以在上面地址提出来,我会尽量做出解答!希望可以帮到初学Android的朋友!
资源推荐
资源详情
资源评论
收起资源包目录
Mp3Player.rar (99个子文件)
Mp3Player
.project 845B
default.properties 362B
bin
Mp3Player.apk 91KB
yin
model
Mp3Info.class 2KB
mp3player
Mp3DownListActivity$DownButtonListener.class 1KB
R$string.class 706B
Mp3PlayerApp.class 753B
Mp3PlayUIActivity.class 8KB
R$layout.class 578B
Mp3PlayListActivity.class 5KB
MainActivity.class 3KB
Mp3PlayUIActivity$3.class 2KB
R$dimen.class 488B
R$drawable.class 1KB
Mp3DownListActivity$1.class 1KB
Mp3PlayListActivity$ImgBtnUpdateListener.class 1KB
LrcParse.class 3KB
Mp3DownListActivity.class 8KB
R.class 582B
Mp3PlayUIActivity$UpdateLrc.class 4KB
R$style.class 387B
Mp3PlayListActivity$1.class 2KB
Mp3DownListActivity$UpdateThread.class 1KB
R$attr.class 325B
service
PlayerService.class 6KB
PlayerService$3.class 1KB
DownLoadService.class 2KB
PlayerService$1.class 3KB
PlayerService$2.class 829B
DownLoadService$DownLoadRunnable.class 3KB
IPlayer.class 752B
IPlayer$Stub$Proxy.class 4KB
PlayerService$4.class 1004B
IPlayer$Stub.class 3KB
DownLoadService$1.class 1KB
IPlayer.aidl 331B
Mp3PlayUIActivity$1.class 1KB
R$id.class 1KB
Mp3PlayUIActivity$2.class 2KB
tools
FileTools.class 3KB
Mp3ListContentHandler.class 2KB
HttpDownLoader.class 3KB
StringTools.class 1KB
resources.ap_ 66KB
classes.dex 46KB
proguard.cfg 1KB
AndroidManifest.xml 1KB
src
yin
model
Mp3Info.java 2KB
mp3player
Mp3PlayerApp.java 338B
Mp3PlayListActivity.java 4KB
LrcParse.java 3KB
MainActivity.java 2KB
Mp3PlayUIActivity.java 10KB
Mp3DownListActivity.java 7KB
service
PlayerService.java 7KB
IPlayer.aidl 331B
DownLoadService.java 3KB
tools
Mp3ListContentHandler.java 1KB
FileTools.java 3KB
HttpDownLoader.java 2KB
StringTools.java 798B
res
values
styles.xml 868B
strings.xml 604B
dimens.xml 217B
layout
mp3_play_ui.xml 3KB
mp3_down_listview.xml 826B
mp3info_item_play.xml 477B
mp3info_item_down.xml 1KB
main.xml 2KB
mp3_play_listview.xml 737B
drawable-ldpi
icon.png 2KB
drawable-hdpi
btn_pause.png 4KB
btn_last.png 3KB
btn_play_press.png 7KB
home_btn_bg_s.png 1KB
home_btn_bg_n.png 592B
seek_thumb.png 3KB
icon_downlist.png 2KB
icon_mp3ring.png 1KB
Thumbs.db 18KB
home_btn_bg_d.png 3KB
btn_play.png 4KB
btn_next.png 3KB
icon_checkupdate.png 1KB
btn_pause_press.png 6KB
icon_playlist.png 2KB
maintab_toolbar_bg.png 400B
btn_last_press.png 4KB
btn_next_press.png 4KB
drawable
tabs_btn_bg.xml 543B
btn_play_bg.xml 367B
btn_next_bg.xml 363B
btn_pause_bg.xml 365B
seek_style.xml 913B
btn_last_bg.xml 363B
drawable-mdpi
icon.png 3KB
.classpath 280B
gen
yin
model
mp3player
R.java 4KB
service
IPlayer.java 10KB
assets
共 99 条
- 1
yinyuping
- 粉丝: 7
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页