基于Android系统的音乐播放器设计与实现
源
程
序
2014年4月19日
.Project
spMusicPlayer01
com.android.ide.eclipse.adt.ResourceManagerBuilder
com.android.ide.eclipse.adt.PreCompilerBuilder
org.eclipse.jdt.core.javabuilder
com.android.ide.eclipse.adt.ApkBuilder
com.android.ide.eclipse.adt.AndroidNature
org.eclipse.jdt.core.javanature
.classpath
AndroidManifest.xml
package="sled.develop"
android:versionCode="1"
android:versionName="1.0">
android:label="@string/app_name">
android:label="@string/app_name">
LocalMpsList.java
package sled.develop;
import java.util.ArrayList;
import java.util.List;
import sled.develop.service.ListSrv;
import sled.model.MpsIterm;
import sled.utils.AdapterUtils;
import sled.utils.AppConstant;
import sled.utils.FileUtils;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.SimpleAdapter;
public class LocalMpsList extends ListActivity{
private List
mp3s =null;
private RadioGroup radiogroup ;
private RadioButton single ;
private RadioButton order ;
private RadioButton radom ;
private int mode = AppConstant.JUMP_MODE_ORDER ;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.locallist);
single = (RadioButton)findViewById(R.id.single);
order = (RadioButton)findViewById(R.id.order);
radom = (RadioButton)findViewById(R.id.radom);
radiogroup = (RadioGroup)findViewById(R.id.menu);
radiogroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
if(checkedId == single.getId()){
mode = AppConstant.JUMP_MODE_SINGLE;
}else if(checkedId == order.getId()){
mode = AppConstant.JUMP_MODE_ORDER;
}else if(checkedId == radom.getId()){
mode = AppConstant.JUMP_MODE_RADOM;
}
}
});
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
//MpsIterm mp3=mp3s.get(position);
Intent preintent = new Intent();
preintent.putExtra("position", position);
preintent.putExtra("cmd", AppConstant.JUMP_CMD_PREPARE);
preintent.putExtra("mode", mode);
preintent.setClass(LocalMpsList.this, ListSrv.class);
startService(preintent);
/*
Intent intent=new Intent();
intent.putExtra("mp3", mp3);
intent.setClass(this, MpsPlayer.class);
startActivity(intent);
*/
onStop();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
updateListView();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
finish();
}
private void updateListView(){
FileUtils fileUtils=new FileUtils();
mp3s=fileUtils.getMp3Files("mp3");
if (mp3s==null){//如果本地目录找不到Mp3文件
mp3s=new ArrayList();
MpsIterm mp3=new MpsIterm();
mp3.setName_mp3("没有Mp3文件!");
mp3.setSize_mp3(0);
mp3s.add(mp3);
}
AdapterUtils au=new AdapterUtils(this,R.layout.mp3info_item,mp3s);
SimpleAdapter simpleAdapter=au.buildSimpleAdapter();
setListAdapter(simpleAdapter);
}
}
ItrActivity.java
package sled.develop;
import android.app.Activity;
import android.os.Bundle;
public class ItrActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.introduction);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
finish();
}
}
MpsPlayer.java
package sled.develop;
import sled.develop.service.ListSrv;
import sled.develop.service.PlayerSrv;
import sled.utils.AppConstant;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
public class MpsPlayer extends Activity implements AppConstant {
private AudioManager am = null ;
private IntentFilter intentFilter=null;
private BroadcastReceiver receiver=null;
private Intent playIntent=null;
private Intent intentnext = null ;
private Thread t = null ;
private LinearLayout ll = null;
private ImageButton last_btn = null ;
private ImageButton pause_btn = null ;
private ImageButton play_btn = null ;
private ImageButton next_btn = null ;
private ImageButton list_btn = null ;
private SeekBar seekbar = null ;
private TextView time_view = null ;
private TextView lrc_view = null ;
private TextView mp3info_view = null ;
private ImageView song_img = null ;
private ImageView volbar = null ;
private ImageView logo = null ;
private int SysMaxVolume , CurVolume;
private int [] vol_id = {R.drawable.vol_0,
R.drawable.vol_1,
R.drawable.vol_2,
R.drawable.vol_3,
R.drawable.vol_4,
R.drawable.vol_5,
R.drawable.vol_6,
R.drawable.vol_7};
private int [] logo_id = {R.drawable.logo_0,
R.drawable.logo_1,
R.drawable.logo_2,
};
int logo_index = 0 ;
float downX = 0 ;
float downY = 0 ;
float upX = 0 ;
float upY = 0 ;
float relateX ;
float relateY ;
long tempT = 0 ;
long downT = 0 ;
long moveT = 0 ;
long upT = 0 ;
private float CLICK_POINTOR = 80 ;
//int count = 0 ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ll = (LinearLayout)findViewById(R.id.control_view);
last_btn = (ImageButton)findViewById(R.id.last);
last_btn.setOnClickListener(new LastOnclickListener());
pause_btn = (ImageButton)findViewById(R.id.pause);
pause_btn.setOnClickListener(new PauseOnclickListener());
play_btn = (ImageButton)findViewById(R.id.play);
play_btn.setOnClickListener(new PlayOnclickListener());
next_btn = (ImageButton)findViewById(R.id.next);
next_btn.setOnClickListener(new NextOnclickListener());
list_btn = (ImageButton)findViewById(R.id.list);
list_btn.setOnClickListener(new ListOnclickListener());
seekbar = (SeekBar)findViewById(R.id.progressbar);
seekbar.setOnSeekBarChangeListener(new SeekBarListener());
time_view = (TextView)findViewById(R.id.timeview);
lrc_view = (TextView)findViewById(R.id.lrcview);
mp3info_view = (TextView)findViewById(R.id.mp3_info);
song_img = (ImageView)findViewById(R.id.img_of_the_song);
volbar = (ImageView)findViewById(R.id.volfasebar);
logo = (ImageView)findViewById(R.id.logo);
}
@Override
protected void onResume() {
super.onResume();
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
SysMaxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
receiver=new LrcMessBroadcastReceiver();
//两个参数,一个是指明操作,一个是指明过滤
registerReceiver(receiver,getIntentFilter());
initPlayerSrv();
initListSrv();
dosomething(null,null);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add(0, 1, 1, "操作说明");
menu.add(0, 2, 2, "完全退出");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if(item.getItemId() == 1){
Intent tintent = new Intent();
tintent.setClass(MpsPlayer.this, ItrActivity.class);
startActivity(tintent);
}
else if(item.getItemId() == 2){
stopService(playIntent);
stopService(intentnext);
finish();
}
return true;
}
@Override
protected void onRestart() {
super.onRestart();
}
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}
//一些基本布局
public void dosomething(String mp3info,String img){
Bitmap bm ;
if(mp3info == null || img == null ){
mp3info = "NO MUSIC SELECTED";
song_img.setImageResource(R.drawable.logo_0);
mp3info_view.setText(mp3info);
}
else{
//System.out.println(img);
mp3info = "当前播放:" + mp3info;
bm = BitmapFactory.decodeFile("/sdcard/mp3/img/" + img);
if(bm == null){
song_img.setImageResource(R.drawable.logo_0);
}else{
song_img.setImageBitmap(bm);
}
mp3info_view.setText(mp3info);
}
}
/**
* 一些按钮和进度条的监听方法
* @author Administrator
*
*/
class LastOnclickListener implements OnClickListener{
@Override
public void onClick(View v) {
lastMusic();
}
}
class PauseOnclickListener implements OnClickListener{
@Override
public void onClick(View v) {
pauseMp3();
//t.start();
}
}
class PlayOnclickListener implements OnClickListener{
@Override
public void onClick(View v) {
initPlayerSrv();
playMp3();
}
}
class NextOnclickListener implements OnClickListener{
@Override
public void onClick(View v) {
nextMusic();
}
}
public void initListSrv(){
intentnext = new Intent();
intentnext.setClass(MpsPlayer.this, ListSrv.class);
}
public void nextMusic(){
intentnext.putExtra("cmd", AppConstant.JUMP_CMD_NEXT);
startService(intentnext);
}
public void lastMusic(){
Intent intentnext = new Intent();
intentnext.putExtra("cmd", AppConstant.JUMP_CMD_LAST);
intentnext.setClass(MpsPlayer.this, ListSrv.class);
startService(intentnext);
}
class SeekBarListener implements SeekBar.OnSeekBarChangeListener{
//进度条事件响应
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
}
public void onStartTrackingTouch(SeekBar arg0) {
}
public void onStopTrackingTouch(SeekBar arg0) {
if (seekbar.getMax()<1) return;
if (playIntent==null)initPlayerSrv();
playIntent.putExtra("startTime",arg0.getProgress() );
playIntent.putExtra("mediaCmd", AppConstant.MEDIA_CMD_SEEKTO);
startService(playIntent);
if (receiver==null) receiver=new LrcMessBroadcastReceiver();
//两个参数,一个是指明操作,一个是指明过滤
registerReceiver(receiver,getIntentFilter());
}
}
class ListOnclickListener implements OnClickListener{
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MpsPlayer.this, LocalMpsList.class);
startActivity(intent);
}
}
/**
* 一些基本操作,为方便代码复用
*/
//开始Service
private void initPlayerSrv(){
playIntent =new Intent();
playIntent.setClass(MpsPlayer.this,PlayerSrv.class);
}
//发送播放操作给Service
private void playMp3() {
playIntent.putExtra("mediaCmd", AppConstant.MEDIA_CMD_PLAY);
startService (playIntent);
}
//发送暂停操作给Service
private void pauseMp3() {
playIntent.putExtra("mediaCmd", AppConstant.MEDIA_CMD_PAUSE);
startService (playIntent);
}
//得到广播的Itent
private IntentFilter getIntentFilter(){
if (intentFilter==null){
intentFilter=new IntentFilter();
intentFilter.addAction(AppConstant.LRC_MESSAGE_ACTION);
}
return intentFilter;
}
//换算歌曲时间
private String getTimeStr(long offsetTime,boolean isLongFormat){
int remainder=0;
int mode=0;
remainder=((int)offsetTime) / (60 * 1000);
String min=remainder +"";
mode=((int)offsetTime) % (60 * 1000);
remainder=mode / 1000;
String sec=remainder +"";
if (isLongFormat){
mode=mode % 1000;
String mill=mode/10 +"";
return min +":" +sec + "." +mill;}
else{
return min +":" +sec;
}
}
/**
* 捕获广播和触屏事件的方法
* @author Administrator
*
*/
//更新歌词,时间,进度条等控件
class LrcMessBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent arg1) {
logo.setImageResource(logo_id[logo_index++%logo_id.length]);
int uiCmd=arg1.getIntExtra("uiCmd", AppConstant.UI_CMD_UPDATELRC);
if (uiCmd==AppConstant.UI_CMD_UPDATELRC){
String lrcMess=arg1.getStringExtra("lrcMess");
lrc_view.setText(lrcMess);
}
else if (uiCmd==AppConstant.UI_CMD_UPDATEPLAYING){
long currPos=arg1.getLongExtra("currPos", 0);
int duration = arg1.getIntExtra("duration", 0);
String mp3info = arg1.getStringExtra("mp3info");
String img = arg1.getStringExtra("img");
dosomething(mp3info,img);
seekbar.setMax(duration);
seekbar.setProgress((int) currPos);
time_view.setText(getTimeStr(currPos,false) + "/" + getTimeStr((long)duration,false));
}
else if (uiCmd==AppConstant.UI_CMD_INITPROGRESSBAR){
int duration=arg1.getIntExtra("duration", 0);
seekbar.setMax(duration);
time_view.setText("00:00/" + getTimeStr((long)duration,false));
}
else if (uiCmd==AppConstant.UI_CMD_CLEARPLAYINFO){
lrc_view.setText("");
seekbar.setProgress(0);
}
}
}
//捕捉和识别触屏事件
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
downX = event.getX();
downY = event.getY();
downT = event.getEventTime();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
upX = event.getX();
upY = event.getY();
upT = event.getEventTime();
break;
}
relateX = downX - upX ;
relateY = downY - upY ;
//一次点击事件完成
if(upT > 0){
//是一次点击事件
if(Math.abs(relateX) <= CLICK_POINTOR && Math.abs(relateY) <= CLICK_POINTOR){
//点击超过一秒,定义为长触屏事件
if(upT - downT > 500){
Intent intent = new Intent();
intent.setClass(MpsPlayer.this, LocalMpsList.class);
startActivity(intent);
}
else{
ll.setVisibility(View.VISIBLE);
t = new Thread(tr);
t.start();
}
}
else if(Math.abs(relateX) > Math.abs(relateY)){
if(downX > upX){
nextMusic();
}
else if(downX < upX){
lastMusic();
}
}
else if(Math.abs(relateX) < Math.abs(relateY)){
if(downY < upY){
turnvol(AudioManager.ADJUST_LOWER);
}
else if(downY > upY){
turnvol(AudioManager.ADJUST_RAISE);
}
}
upT = -1 ;
//upX = upY = 0 ;
}
return super.onTouchEvent(event);
}
//代码复用,关于音量调节
public void turnvol(int value){
am.adjustStreamVolume (AudioManager.STREAM_MUSIC, value,0);
CurVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
int num_pic = (7*CurVolume)/SysMaxVolume ;
volbar.setImageResource(vol_id[num_pic]);
volbar.setVisibility(View.VISIBLE);
Thread thread = new Thread(tv);
thread.start();
}
/**
* 音量条延迟线程
*/
Handler vhandler = new Handler();
Runnable tv = new Runnable(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
vhandler.post(vr);
}
};
Runnable vr = new Runnable(){
@Override
public void run() {
volbar.setVisibility(View.GONE);
}
};
/**
* 进度条等按钮延迟线程
*/
Handler handler = new Handler();
Runnable tr = new Runnable(){
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(r);
}
};
Runnable r = new Runnable() {
@Override
public void run() {
ll.setVisibility(View.GONE);
}
};
}
ListSrv.java
package sled.develop.service;
import java.util.ArrayList;
import java.util.Random;
import sled.model.MpsIterm;
import sled.utils.AppConstant;
import sled.utils.FileUtils;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class ListSrv extends Service implements AppConstant{
private FileUtils files ;
private Intent intentplay = null ;
private MpsIterm mp3_next = null ;
private MpsIterm mp3_last = null ;
private int cmd = AppConstant.JUMP_CMD_PREPARE;
private int mode = Ap
上一篇:基于Android系统的车载视频机器人设计-毕业设计(论文)任务指导书
下一篇:面向android系统的测试工具_毕业论文