編輯:關於Android編程
在經過幾天的折騰之後,迎來了Mp3播放器的第二篇博客,這篇文章主要將如何實現播放器的播放,下一首,上一首,順序播放,循環播放,隨機播放,單曲循環等操作。
其實操作的過程中主要是通過參數的傳遞來實現功能的。
在activity裡面互相傳參有很多中方法,但對於activity和service進行交互有些方法並不適合,通過對Broadcast和BroadcastReceiver等操作,來控制播放的實現。
我們先設定好廣播,然後通過發送信號來進行傳遞數據。
主要在activity裡面動態注冊廣播,通過傳遞播放的順序選擇,Mp3的url,Mp3播放的位置到service裡面,service裡面接受傳來的廣播,獲得參數,在進行對應的操作。
還有一個要解決的問題就是,如何通過service將播放的時間和歌曲信息反饋到activity裡面,然後更新標題,時間,所以就是參數在service和activity之間進行傳遞,在程序中通過handle來處理程序的更新數據,通過handle來和activity交互,但由於沒有開啟線程,所以十分耗時的操作可能不適合,在下一個版本可能需要著手解決這個問題。
所以對於廣播的處理就顯得比較重要了。
先將作出的效果粘貼出來,目前還沒有歌詞等處理。
對於裡面流程的處理十分重要,需要不斷的調試,這是最為花費功夫的。
activity_main.xml布局文件
主要功能通過展示listview來顯示內容。
自定義子部局:
listmusic.xml
MainActivity.java
主要獲取mp3文件,對於裡面出現的Mp3infos這個類,參考我上篇文章,這篇文章沒有修改。
package com.flashmusic;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.flashmusic.tool.Mp3Info;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends Activity implements AdapterView.OnItemClickListener {
//Music的listview控件
private ListView MusicList;
// 存儲數據的數組列表
ArrayList> MusiclistData = new ArrayList>();
// 適配器
private SimpleAdapter MusicListAdapter;
//存放mp3信息
static List mp3Infos;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MusicList = (ListView) findViewById(R.id.listviewmusic);
mp3Infos = getMp3Infos();
GetData(mp3Infos);
MusicListAdapter = new SimpleAdapter(
this,
MusiclistData,
R.layout.listmusic,
new String[]{"ID", "Title", "Artist", "Icon"},
new int[]{R.id.MusicID, R.id.Musictitle, R.id.MusicArtist, R.id.MusicIcon}
);
//賦予數據
MusicList.setAdapter(MusicListAdapter);
MusicList.setOnItemClickListener(MusiclistListen);
}
AdapterView.OnItemClickListener MusiclistListen = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView adapterView, View view, int i, long l) {
// //Toast.makeText(MainActivity.this, String.valueOf(l), Toast.LENGTH_SHORT).show();
//
// //判斷當前服務是否已經開啟
// if(isServiceRunning(getBaseContext(),"com.flashmusic.MusicService")){
// stopService(new Intent(MainActivity.this, MusicService.class));
// }
// Intent intent = new Intent();
// intent.putExtra("url", mp3Infos.get(i).getUrl());
// intent.putExtra("position",String.valueOf(i));
// intent.setClass(MainActivity.this, MusicService.class);
// //啟動服務
// startService(intent);
Intent musicintent = new Intent(MainActivity.this, MusicActivity.class);
//當前播放的位置
musicintent.putExtra("position", String.valueOf(i));
MusicActivity.mp3Infos = mp3Infos;
// MusicActivity.musicserviceintent = intent;
//啟動音樂播放界面
startActivity(musicintent);
}
};
//判斷服務是否存在
public static boolean isServiceRunning(Context mContext,String className) {
boolean isRunning = false;
ActivityManager activityManager = (ActivityManager)
mContext.getSystemService(Context.ACTIVITY_SERVICE);
List serviceList= activityManager.getRunningServices(50);
if (!(serviceList.size()>0)) {
return false;
}
for (int i=0; i mp3Infos) {
for (int i = 0; i < mp3Infos.size(); i++) {
HashMap map = new HashMap();
map.put("ID",mp3Infos.get(i).getID());
map.put("Title", mp3Infos.get(i).getTitle());
map.put("Artist", mp3Infos.get(i).getArtist());
map.put("Icon", R.drawable.musicicon);
MusiclistData.add(map);
}
}
public List getMp3Infos() {
Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
int ID = 0;
List mp3Infos = new ArrayList();
for (int i = 0; i < cursor.getCount(); i++) {
Mp3Info mp3Info = new Mp3Info();
cursor.moveToNext();
long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID)); //音樂id,音樂ID不是播放的順序
String title = cursor.getString((cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));//音樂標題
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));//藝術家
long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));//時長
long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)); //文件大小
String url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); //文件路徑
int isMusic = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否為音樂
if (isMusic != 0) {
//只把音樂添加到集合當中
ID++;
mp3Info.setID(ID);
mp3Info.setTitle(title);
mp3Info.setArtist(artist);
mp3Info.setDuration(duration);
mp3Info.setSize(size);
mp3Info.setUrl(url);
mp3Infos.add(mp3Info);
}
}
return mp3Infos;
}
@Override
public void onItemClick(AdapterView adapterView, View view, int i, long l) {
}
}
musicplay.xml,播放界面的布局
接下來就是MusicActivity.java
這裡面有個東西我覺得非常好,就是用了static變量,來共享mp3infos文件信息,通過MainActivity函數來賦值進來,相當於不再需要另一塊內存來存儲數據了,service也是這樣實現的,這樣每次我們只需要將位置position傳進去就能夠解決問題了。
package com.flashmusic;
import com.flashmusic.tool.PlayerMSG;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.ThemedSpinnerAdapter;
import android.widget.Toast;
import com.flashmusic.tool.Mp3Info;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.TimeZone;
public class MusicActivity extends Activity implements View.OnClickListener {
//mp3需要播放的數據
static List mp3Infos;
static Intent musicserviceintent;
//播放按鈕
private ImageView MusicPlay;
//下一首
private ImageView MusicNext;
//上一首
private ImageView MusicPrevious;
//播放方式選擇
private ImageView MusicMOde;
//播放菜單
private ImageView MusicMenu;
//顯示總時間
private TextView MusicTime;
//顯示當前時間
private TextView MusicCurrentTime;
//顯示歌曲名
private TextView MusicTitle;
//顯示歌曲藝術家
private TextView MusicArtist;
//進度條
SeekBar seekBar;
//廣播
MusicPlayerReceiver musicPlayerReceiver;
private final int isorderplay = 0;//順序播放
private final int islistloop = 1;//表示列表循環
private final int isrepeatone = 2;//單曲循環
private final int israndomplay = 3;//隨機
public static final String UPDATE_ACTION = "com.flashmusic.action.UPDATE_ACTION"; //更新動作
public static final String CTL_ACTION = "com.flashmusic.action.CTL_ACTION"; //控制動作
public static final String MUSIC_CURRENT = "com.flashmusic.action.MUSIC_CURRENT"; //音樂當前時間改變動作
public static final String MUSIC_DURATION = "com.flashmusic.action.MUSIC_DURATION";//音樂播放長度改變動作
public static final String MUSIC_PLAYING = "com.flashmusic.action.MUSIC_PLAYING"; //音樂正在播放動作
public static final String REPEAT_ACTION = "com.flashmusic.action.REPEAT_ACTION"; //音樂重復播放動作
public static final String SHUFFLE_ACTION = "com.flashmusic.action.RANDOM_ACTION";//音樂隨機播放動作
public static final String PLAY_STATUE = "com.flashmusic.action.PLAY_STATUE"; //更新播放狀態
//是否綁定了對應的service
Boolean mBound = false;
//播放方式表識0表示順序播放,1表示列表循環,2表示單曲循環,3表示隨機,初始為順序播放
int playmodeflag = 0;
//歌曲播放的位置,就能夠獲取位置
int position;
int currentTime;
int duration;//總時間
//記錄鼠標點擊了幾次,播放和暫停狀態
boolean playorpauseflag = false;
//播放服務
MusicService mService;
// 正在播放
private boolean isPlaying;
// 暫停
private boolean isPause;
//多線程,後台更新UI
Thread myThread;
//控制後台線程退出
boolean playStatus = true;
//轉換毫秒數為時間模式,一般都是分鐘數,音樂文件
public static String formatDuring(long mss) {
long days = mss / (1000 * 60 * 60 * 24);
long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60);
long seconds = (mss % (1000 * 60)) / 1000;
return String.format("%02d", minutes) + ":" + String.format("%02d", seconds);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.musicplay);
//初始化控件
InitView();
//獲得傳過來的值
Intent intent = getIntent();
position = Integer.parseInt(intent.getStringExtra("position"));
MusicArtist.setText(mp3Infos.get(position).getArtist());
MusicTitle.setText(mp3Infos.get(position).getTitle());
//注冊廣播
musicPlayerReceiver = new MusicPlayerReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(UPDATE_ACTION);
filter.addAction(MUSIC_CURRENT);
filter.addAction(MUSIC_DURATION);
filter.addAction(PLAY_STATUE);
registerReceiver(musicPlayerReceiver, filter);
//設置響應事件
MusicNext.setOnClickListener(this);
MusicPrevious.setOnClickListener(this);
MusicMenu.setOnClickListener(this);
MusicMOde.setOnClickListener(this);
MusicPlay.setOnClickListener(this);
seekBar.setOnSeekBarChangeListener(seekBarChangeListener);
PlayMusic();
}
//初始化控件
void InitView() {
MusicPlay = (ImageView) findViewById(R.id.musicplay);
MusicNext = (ImageView) findViewById(R.id.musicnext);
MusicPrevious = (ImageView) findViewById(R.id.musicprevious);
MusicMenu = (ImageView) findViewById(R.id.musicplaymenu);
MusicMOde = (ImageView) findViewById(R.id.musicplaymode);
MusicTime = (TextView) findViewById(R.id.playtime);
MusicCurrentTime = (TextView) findViewById(R.id.playcurrenttime);
MusicTitle = (TextView) findViewById(R.id.musictitle);
MusicArtist = (TextView) findViewById(R.id.musicartist);
seekBar = (SeekBar) findViewById(R.id.MusicProgress);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onClick(View v) {
Intent intent = new Intent();
switch (v.getId()) {
case R.id.musicplay:
if (isPlaying) {
MusicPlay.setImageDrawable(getResources().getDrawable(R.drawable.musicpause, null));
intent.setClass(MusicActivity.this, MusicService.class);
intent.putExtra("MSG", PlayerMSG.MSG.PAUSE_MSG);
startService(intent);
isPlaying = false;
} else {
MusicPlay.setImageDrawable(getResources().getDrawable(R.drawable.musicplay, null));
intent.setClass(MusicActivity.this, MusicService.class);
intent.putExtra("MSG", PlayerMSG.MSG.CONTINUE_MSG);
startService(intent);
isPlaying = true;
}
break;
case R.id.musicplaymode:
setPlayMOde();
break;
case R.id.musicnext:
PlayNextMusic();
break;
case R.id.musicprevious:
PlayPreviousMusic();
break;
case R.id.musicplaymenu:
break;
default:
break;
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
void setPlayMOde() {
playmodeflag++;
Intent intent = new Intent(CTL_ACTION);
intent.putExtra("control", playmodeflag);
sendBroadcast(intent);
switch (playmodeflag) {
case isorderplay:
MusicMOde.setImageDrawable(getResources().getDrawable(R.drawable.orderplay, null));
break;
case islistloop:
MusicMOde.setImageDrawable(getResources().getDrawable(R.drawable.repeatplay, null));
break;
case isrepeatone:
MusicMOde.setImageDrawable(getResources().getDrawable(R.drawable.repeatoneplay, null));
break;
case israndomplay:
MusicMOde.setImageDrawable(getResources().getDrawable(R.drawable.randomplay, null));
playmodeflag = -1;
break;
default:
break;
}
}
SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
//停止拖動事件
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//手動調節進度
// TODO Auto-generated method stub
//seekbar的拖動位置
int progress = seekBar.getProgress();
ChangeProgress(progress);
//調用service調節播放進度
// mService.setProgress(max, dest);
}
//數值改變事件
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
// TODO Auto-generated method stub
}
//開始拖動事件
@Override
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
};
public void ChangeProgress(int progress) {
Intent intent = new Intent();
intent.setClass(MusicActivity.this, MusicService.class);
intent.putExtra("url", mp3Infos.get(position).getUrl());
intent.putExtra("position", position);
intent.putExtra("MSG", PlayerMSG.MSG.PROGRESS_CHANGE);
intent.putExtra("progress", progress);
startService(intent);
}
//播放音樂
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void PlayMusic() {
isPlaying = true;
MusicPlay.setImageDrawable(getResources().getDrawable(R.drawable.musicplay, null));
// 開始播放的時候為順序播放
Intent intent = new Intent();
intent.setClass(MusicActivity.this, MusicService.class);
intent.putExtra("url", mp3Infos.get(position).getUrl());
intent.putExtra("position", position);
intent.putExtra("MSG", PlayerMSG.MSG.PLAY_MSG);
MusicService.mp3Infos = mp3Infos;
startService(intent);
}
//播放上一首音樂
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void PlayPreviousMusic() {
position = position - 1;
// MusicPlay.setImageDrawable(getResources().getDrawable(R.drawable.musicpause,null));
if (position < 0) {
position = mp3Infos.size() - 1;
}
Mp3Info mp3Info = mp3Infos.get(position);
MusicTitle.setText(mp3Info.getTitle());
MusicArtist.setText(mp3Info.getArtist());
Intent intent = new Intent();
intent.setClass(MusicActivity.this, MusicService.class);
intent.putExtra("url", mp3Info.getUrl());
intent.putExtra("position", position);
intent.putExtra("MSG", PlayerMSG.MSG.PRIVIOUS_MSG);
startService(intent);
isPlaying = true;
MusicPlay.setImageDrawable(getResources().getDrawable(R.drawable.musicplay, null));
}
//播放下一首音樂
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void PlayNextMusic() {
//判斷是否是隨機播放,因為隨機播放設置後,playmodeflag變為-1了
if (playmodeflag == -1) {
Random random = new Random();
position = random.nextInt(mp3Infos.size());
} else
position = position + 1;
if (position >= mp3Infos.size())
position = 0;
Mp3Info mp3Info = mp3Infos.get(position);
MusicTitle.setText(mp3Info.getTitle());
MusicArtist.setText(mp3Info.getArtist());
Intent intent = new Intent();
intent.setClass(MusicActivity.this, MusicService.class);
intent.putExtra("url", mp3Info.getUrl());
intent.putExtra("position", position);
intent.putExtra("MSG", PlayerMSG.MSG.NEXT_MSG);
startService(intent);
MusicPlay.setImageDrawable(getResources().getDrawable(R.drawable.musicplay, null));
isPlaying = true;
}
public class MusicPlayerReceiver extends BroadcastReceiver {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//當前時間更新
if (action.equals(MUSIC_CURRENT)) {
currentTime = intent.getIntExtra("currentTime", -1);
seekBar.setProgress(currentTime);
MusicCurrentTime.setText(formatDuring(currentTime));
} else if (action.equals(MUSIC_DURATION)) {
//總時間更新
duration = intent.getIntExtra("duration", -1);
seekBar.setMax(duration);
MusicTime.setText(formatDuring(duration));
} else if (action.equals(UPDATE_ACTION)) {
position = intent.getIntExtra("position", -1);
String url = mp3Infos.get(position).getUrl();
MusicTitle.setText(mp3Infos.get(position).getTitle());
MusicArtist.setText(mp3Infos.get(position).getArtist());
MusicTime.setText(formatDuring(mp3Infos.get(position).getDuration()));
} else if (action.equals(PLAY_STATUE)) {
boolean playstatue = intent.getBooleanExtra("playstatue", true);
if (playstatue) {
MusicPlay.setImageDrawable(getResources().getDrawable(R.drawable.musicplay, null));
isPlaying = true;
} else {
MusicPlay.setImageDrawable(getResources().getDrawable(R.drawable.musicpause, null));
isPlaying = false;
}
}
}
}
public void onDestroy() {
//銷毀activity時,要記得銷毀線程
playStatus = false;
super.onDestroy();
}
}
這裡面有許多細節,處理的過程就是不斷調試。
最為重要的就是寫service了,這個裡面主要涉及到MP3的播放,暫停,切換,上一首,進行操作的主要是接受MusicActivity裡面傳過來的廣播,然後進行判斷,然後處理對應的函數。說的就是這麼簡單,但處理起來,並不是很好解決。
MusicService.java
package com.flashmusic;
import com.flashmusic.tool.PlayerMSG;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
import com.flashmusic.tool.Mp3Info;
import java.util.ArrayList;
import java.util.List;
public class MusicService extends Service {
// mp3的絕對路徑
private String path;
//當前播放位置
private int position;
//當前播放進度
private int currentTime;
private int msg; //播放信息
private boolean isPause;
static List mp3Infos; //存放Mp3Info對象的集合
private int duration; //播放長度
int palyflag = 0;
//服務要發送的一些Action
public static final String UPDATE_ACTION = "com.flashmusic.action.UPDATE_ACTION"; //更新音樂播放曲目
public static final String CTL_ACTION = "com.flashmusic.action.CTL_ACTION"; //控制播放模式
public static final String MUSIC_CURRENT = "com.flashmusic.action.MUSIC_CURRENT"; //當前音樂播放時間更新
public static final String MUSIC_DURATION = "com.flashmusic.action.MUSIC_DURATION";//播放音樂長度更新
public static final String PLAY_STATUE = "com.flashmusic.action.PLAY_STATUE"; //更新播放狀態
//播放音樂的媒體類
MediaPlayer mediaPlayer;
//廣播接收器,接收來自MusicActivity的廣播
private MusicReceiver musicReceiver;
IBinder musicBinder = new MyBinder();
//handler用來接收消息,來發送廣播更新播放時間
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
if (mediaPlayer != null) {
currentTime = mediaPlayer.getCurrentPosition();
Intent intent = new Intent();
intent.setAction(MUSIC_CURRENT);
intent.putExtra("currentTime", currentTime);
sendBroadcast(intent); // 給PlayerActivity發送廣播
mHandler.sendEmptyMessageDelayed(1, 1000);
}
break;
default:
break;
}
}
;
};
class MyBinder extends Binder {
public Service getService() {
return MusicService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = new MediaPlayer();
/**
* 設置音樂播放完成時的監聽器
*/
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Intent intent = new Intent(PLAY_STATUE);
// 發送播放完畢的信號,更新播放狀態
intent.putExtra("playstatue", false);
sendBroadcast(intent);
// Toast.makeText(getApplicationContext(),"服務完成了",Toast.LENGTH_SHORT).show();
if (palyflag == 2) {
Intent loopintent = new Intent(PLAY_STATUE);
// 發送播放完畢的信號,更新播放狀態
intent.putExtra("playstatue", true);
sendBroadcast(loopintent);
// 單曲循環
mediaPlayer.start();
} else if (palyflag == 1) {
// 列表循環
position++;
if (position > mp3Infos.size() - 1) {
//變為第一首的位置繼續播放
position = 0;
}
Intent sendIntent = new Intent(UPDATE_ACTION);
sendIntent.putExtra("position", position);
// 發送廣播,將被Activity組件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
path = mp3Infos.get(position).getUrl();
play(0);
} else if (palyflag == 0) { // 順序播放
position++; //下一首位置
if (position <= mp3Infos.size() - 1) {
Intent sendIntent = new Intent(UPDATE_ACTION);
sendIntent.putExtra("position", position);
// 發送廣播,將被Activity組件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
path = mp3Infos.get(position).getUrl();
play(0);
} else {
mediaPlayer.seekTo(0);
position = 0;
Intent sendIntent = new Intent(UPDATE_ACTION);
sendIntent.putExtra("position", position);
// 發送廣播,將被Activity組件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
}
} else if (palyflag == 3) { //隨機播放
position = getRandomIndex(mp3Infos.size() - 1);
Intent sendIntent = new Intent(UPDATE_ACTION);
sendIntent.putExtra("position", position);
// 發送廣播,將被Activity組件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
path = mp3Infos.get(position).getUrl();
play(0);
}
}
});
musicReceiver = new MusicReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(CTL_ACTION);
// filter.addAction(SHOW_LRC);
registerReceiver(musicReceiver, filter);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
path = intent.getStringExtra("url"); //歌曲路徑
position = intent.getIntExtra("position", -1); //當前播放歌曲的在mp3Infos的位置
msg = intent.getIntExtra("MSG", 0); //播放信息
if (msg == PlayerMSG.MSG.PLAY_MSG) { //直接播放音樂
play(0);
} else if (msg == PlayerMSG.MSG.PAUSE_MSG) { //暫停
pause();
} else if (msg == PlayerMSG.MSG.STOP_MSG) { //停止
stop();
} else if (msg == PlayerMSG.MSG.CONTINUE_MSG) { //繼續播放
resume();
} else if (msg == PlayerMSG.MSG.PRIVIOUS_MSG) { //上一首
previous();
} else if (msg == PlayerMSG.MSG.NEXT_MSG) { //下一首
next();
} else if (msg == PlayerMSG.MSG.PROGRESS_CHANGE) { //進度更新
currentTime = intent.getIntExtra("progress", -1);
play(currentTime);
} else if (msg == PlayerMSG.MSG.PLAYING_MSG) {
mHandler.sendEmptyMessage(1);
}
return super.onStartCommand(intent, flags, startId);
}
private void play(int currentTime) {
try {
mediaPlayer.reset();// 把各項參數恢復到初始狀態
mediaPlayer.setDataSource(path);
mediaPlayer.prepare(); // 進行緩沖
mediaPlayer.setOnPreparedListener(new PreparedListener(currentTime));// 注冊一個監聽器
//更新播放狀態
Intent intent = new Intent(PLAY_STATUE);
// 發送播放完畢的信號,更新播放狀態
intent.putExtra("playstatue", true);
sendBroadcast(intent);
mHandler.sendEmptyMessage(1);
} catch (Exception e) {
e.printStackTrace();
}
}
//繼續播放
private void resume() {
if (isPause) {
mediaPlayer.start();
isPause = false;
}
}
/**
* 上一首
*/
private void previous() {
Intent sendIntent = new Intent(UPDATE_ACTION);
sendIntent.putExtra("position", position);
// 發送廣播,將被Activity組件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
play(0);
}
/**
* 下一首
*/
private void next() {
Intent sendIntent = new Intent(UPDATE_ACTION);
sendIntent.putExtra("position", position);
// 發送廣播,將被Activity組件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
play(0);
}
private void pause() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
isPause = true;
}
}
private void stop() {
if (mediaPlayer != null) {
mediaPlayer.stop();
try {
mediaPlayer.prepare(); // 在調用stop後如果需要再次通過start進行播放,需要之前調用prepare函數
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 實現一個OnPrepareLister接口,當音樂准備好的時候開始播放
*/
private final class PreparedListener implements MediaPlayer.OnPreparedListener {
private int currentTime;
public PreparedListener(int currentTime) {
this.currentTime = currentTime;
}
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start(); // 開始播放
if (currentTime > 0) { // 如果音樂不是從頭播放
mediaPlayer.seekTo(currentTime);
}
Intent intent = new Intent();
intent.setAction(MUSIC_DURATION);
duration = mediaPlayer.getDuration();
intent.putExtra("duration", duration); //通過Intent來傳遞歌曲的總長度
sendBroadcast(intent);
}
}
protected int getRandomIndex(int end) {
int index = (int) (Math.random() * end);
return index;
}
public class MusicReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int control = intent.getIntExtra("control", -1);
switch (control) {
case 0:
palyflag = 0; // 順序播放
break;
case 1:
palyflag = 1; //列表循環
break;
case 2:
palyflag = 2; //單曲循環
break;
case 3:
palyflag = 3; //隨機
break;
default:
break;
// if(action.equals(SHOW_LRC)){
// current = intent.getIntExtra("listPosition", -1);
// initLrc();
}
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
//當綁定後,返回一個musicBinder
return musicBinder;
}
@Override
public void onDestroy() {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
}
這些函數裡面有個標識,其實有時候,我們並不想通過new一個類來處理信息,這個就是個很好的表示來解決問題。
PlayerMSG.java
package com.flashmusic.tool;
/**
* Created by zhouchenglin on 2016/4/18.
*/
public class PlayerMSG {
public class MSG{
public static final int PLAY_MSG = 1; //播放
public static final int PAUSE_MSG = 2; //暫停
public static final int STOP_MSG = 3; //停止
public static final int CONTINUE_MSG = 4; //繼續
public static final int PRIVIOUS_MSG = 5; //上一首
public static final int NEXT_MSG = 6; //下一首
public static final int PROGRESS_CHANGE = 7;//進度改變
public static final int PLAYING_MSG = 8; //正在播放
}
}
銀聯支付也是一般比較常用的支付功能,這裡簡單了介紹android app如果短期快速應用這一方面的東西。直接上代碼: 1.導入銀聯支付的依賴包: 2.在res目錄下增
新建一個eclipse-android項目後,如test2,從其它項目中拷貝若干個包到test2中,在編譯時總會出現以下錯誤:?主要看第三條:The projec
android設備運行在各種不同的屏幕中,這些屏幕有著不同的screen sizes(屏幕大小)和screen densities(屏幕密度)。screen sizes表
1 背景這篇文章主要說明的是用它來看源碼的相關配置(該實例依據官方源碼進行配置說明)。在android源碼中發現有一個development/tools/idegen目錄