1. 程式人生 > >Android基礎之本地音樂後臺播放

Android基礎之本地音樂後臺播放

使用service後臺播放音樂,彈出通知

public class MainActivity extends Activity {


private MusicAdpater adapter;
private IMusicPlay mMusicPlay;
private ServiceConnection conn = new ServiceConnection() {


@Override
public void onServiceDisconnected(ComponentName name) {


}


@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMusicPlay = (IMusicPlay) service;
}
};


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
startMusicPalyService();
}


private void startMusicPalyService() {
Intent service = new Intent(this, MusicPlayService.class);
// 開啟服務
startService(service);
bindService(service, conn, BIND_AUTO_CREATE);


}


private void initData() {
// 獲取sd卡儲存狀態
String State = Environment.getExternalStorageState();
if (State.equals(Environment.MEDIA_UNMOUNTED)) {
Toast.makeText(this, "外部儲存不存在,請插入", 0).show();
return;
}
File storageDirectory = Environment.getExternalStorageDirectory();
File[] mMusicFiles = storageDirectory.listFiles();
if (mMusicFiles == null) {
Log.v("520it", "mMusicFilesw為空");
return;
}


ArrayList<String> mMusicPaths = new ArrayList<String>();
for (File file : mMusicFiles) {
if (file.getAbsolutePath().endsWith(".mp3")) {
mMusicPaths.add(file.getAbsolutePath());
}
}
adapter.setDatas(mMusicPaths);
adapter.notifyDataSetChanged();


}


/*
* 初始化佈局
*/
private void initView() {
ListView mMusicList = (ListView) findViewById(R.id.musicList_lv);
adapter = new MusicAdpater();
mMusicList.setAdapter(adapter);
mMusicList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
mMusicPlay.callPlayMusic(adapter.getDatas(),position);
}
});
}
//設定播放的模式
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
// 
switch (item.getItemId()) {
case R.id.all_paly: 
//順序播放
saveMusicMode(1);
break;
case R.id.sigle_play: 
//單曲播放
saveMusicMode(2);
break;
case R.id.end: 
//退出應用
//1停止播放音樂,釋放資源
mMusicPlay.callStopPlay();
//關閉服務
unbindService(conn);
Intent service = new Intent(this, MusicPlayService.class);
stopService(service);
//退出activity
finish();

break;
case R.id.stop_when_over: 
//播放完停止
saveMusicMode(0);
break;
}

return true;
}
public void saveMusicMode(int mode){
SharedPreferences sp = getSharedPreferences("MUSIC_UTIL",MODE_PRIVATE);
Editor edit = sp.edit();
edit.putInt("MUSIC_MODE", mode);
edit.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// LayoutInflater 可以將一個佈局轉換成View
// MenuInflater 可以將一個選單欄佈局轉換成選單的View
getMenuInflater().inflate(R.menu.main, menu);
// true 告訴系統 選單欄我們自己處理就可以了
return true;
}


}


*************************************************************************************************************

public class MusicAdpater extends BaseAdapter{
private ArrayList<String> mMusicPaths;
@Override
public int getCount() {
// TODO Auto-generated method stub
return mMusicPaths==null?0:mMusicPaths.size();
}
public void setDatas(ArrayList<String> mMusicPaths) {
// 
this.mMusicPaths=mMusicPaths;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView==null) {
convertView= View.inflate(parent.getContext(), R.layout.music_item, null);
}
TextView mMusicTv = MusicUtils.getView(convertView, R.id.music_tv);
String musicName = MusicUtils.getMusicName(mMusicPaths.get(position));
mMusicTv.setText(musicName);
return convertView;
}


@Override
public String getItem(int position) {
// TODO Auto-generated method stub
return mMusicPaths.get(position);
}


@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public ArrayList<String> getDatas() {
// TODO Auto-generated method stub
return mMusicPaths;
}

}
*******************************************************************************************************************



public class MusicPlayService extends Service {
private MediaPlayer mediaPlayer;
private int currentMusicImndex;
private NotificationManager mManager;


private class MusicPlayServiceAgent extends Binder implements IMusicPlay {


@Override
public void callPlayMusic(ArrayList<String> mMusicPaths, int musicIndex) {
//
playMusic(mMusicPaths, musicIndex);
}


@Override
public void callStopPlay() {
// TODO Auto-generated method stub
stopPlay();
}


}


@Override
public IBinder onBind(Intent intent) {
//
return new MusicPlayServiceAgent();
}


public void playMusic(final ArrayList<String> mMusicPaths,
final int musicIndex) {
currentMusicImndex = musicIndex;
String mMusicPath = mMusicPaths.get(musicIndex);
try {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// 設定監聽,播放完怎麼做
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// 判斷當前 播放時什麼模式
SharedPreferences sp = getSharedPreferences(
"MUSIC_UTIL", MODE_PRIVATE);
int mode = sp.getInt("MUSIC_MODE", 0);
Log.v("520it", "MUSIC_MODE" + mode);
if (mode == 0) {
// 預設就是播完停止,所以這裡什麼都不做
} else if (mode == 1) {
// 順序播放
currentMusicImndex++;
if (currentMusicImndex > mMusicPaths.size() - 1) {
// 如果是播放到最後,重新開始
currentMusicImndex = 0;
}
playMusic(mMusicPaths, currentMusicImndex);
} else if (mode == 2) {
// 單曲繼續播放
playMusic(mMusicPaths, currentMusicImndex);
}
}
});
}
// 在通知欄顯示播放的音樂
showshowNotification(MusicUtils.getMusicName(mMusicPath));
mediaPlayer.reset();
mediaPlayer.setDataSource(mMusicPath);
mediaPlayer.prepare();
mediaPlayer.start();


} catch (Exception e) {


}
}


/*
* 彈出通知框
*/
private void showshowNotification(String musicName) {
//新建通知
Notification mNotification = new Notification(R.drawable.ic_launcher,
"酷狗音樂正在播放:"+musicName, System.currentTimeMillis());
Intent intent=new Intent(this,com.m520it.myMusicPlayer.MainActivity.class);
//PendingIntent.getActivity(context, requestCode, intent, flags)
//設定點選的意圖
PendingIntent contentIntent=PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
//設定下拉通知的內容
mNotification.setLatestEventInfo(this, "酷狗音樂", musicName+"播放中...", contentIntent);
if (mManager==null) {
mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
//彈出提示notify通知id-用來記錄到底是哪個提示資訊
mManager.notify(0, mNotification);
}
public void stopPlay() {
if (mediaPlayer!=null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
//釋放志願
mediaPlayer.release();
mediaPlayer=null;

}
if (mManager!=null) {
//關閉本應用的 所有通知
mManager.cancelAll();
}


}
}


********************************************************************************************************************************

public interface IMusicPlay {
public void callPlayMusic(final ArrayList<String> mMusicPaths,
final int musicIndex);
public void callStopPlay();
}


**************************************************************************************************

public class MusicUtils {
//adapter獲取快取View
public static <T extends View> T getView(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}


public static String getMusicName(String path) {

return path.substring(path.lastIndexOf("/")+1);
}
}


**************************************************************

許可權

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


相關推薦

Android基礎本地音樂後臺播放

使用service後臺播放音樂,彈出通知public class MainActivity extends Activity { private MusicAdpater adapter; private IMusicPlay mMusicPlay; private

Android實現音樂後臺播放

Service是一個生命週期長且沒有使用者介面的程式,當程式在各個activity中切換的時候,我們可以利用service來實現背景音樂的播放,即使當程式退出到後臺的時候,音樂依然在播放。 實現程式碼如下: (1)src/.../MainActivity.java publ

蝸牛—Android基礎button監聽器

自適應 ack cti tool stat action per onclick nts XML文件中有一個textView 和 一個button。 <LinearLayout xmlns:android="http://schemas.android.com/a

iOS音樂後臺播放及鎖屏信息顯示

found 能夠 elf mp3 tps info print pla remote 實現音樂的後臺播放。以及播放時,能夠控制其暫停,下一首等操作,以及鎖屏圖片歌曲名等的顯示 此實例須要真機調試。效果圖例如以下: project下載:gi

aNDROID基礎INTENT(二)

5% hao123 androi music android基礎 lis .com key 基礎 %E8%BD%AC%E8%BD%BDaNDROIDkEY%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B http://music.hao123.co

Android基礎布局ConstraintLayout

工具類 disable star next 出版 vertica 基本用法 特性 box Google I/O 2016 上發布了 ConstraintLayout,據說很強大,那就一探究竟吧! gradle配置 compile ‘com.and

Android基礎自定義Application

ase man googl extends == attach 做到 不知道 ces Application Android提供了一個Application類,每當應用程序啟動時,系統會自動將這個類進行初始化。在項目中,我們在一些工具類采用了單例模式,其生命周期和整個應用程

Android基礎佈局篇

工作之餘,整理一下自己所掌握的Android知識,希望能對學習Android開發的小夥伴有所幫助: android  有五種佈局:     >Linearlayout  線性佈局     >RelativeLayout  相對佈局          >Fra

Android基礎資料儲存(SharedPreference)

Android資料持久化是說在斷電後資料不會丟失,而根據儲存位置和實現方式一般有3種方式,這裡說sharedpreferences: 一,sharedpreferences儲存 該種方式是在應用獨有目錄data/data/[packgename]/shared_prefs/下

Android基礎控制元件

一  TextView    父類 : View     >概念:文字控制元件 :文字內容的顯示   預設配置不可編輯  子類EditText可以編輯          >屬性:     android:text="你好,世界!"        文字內容   

Android 基礎自定義View使用技巧難點總結

1、簡介 該文章記錄的是本人在日常自定義View的一些常見技巧與問題的解決方案。 2、具體案例 2.1 探究畫筆的具體位置 情況1: // 繪製一個 描邊為10f的的一個矩形 @Override protected void onDraw(Canva

Android基礎LinerarLayout

每天一個小目標,你會變得很強大。 先上只用LinerarLayout佈局完成一個登陸介面,效果圖以及藍圖奉上: 所有的佈局以及控制元件都是景觀的子類。 先來點取景功能類常用的屬性: 屬性 含義 機器人:背景

Android基礎RelativeLayout佈局

同LinererLayout佈局的學習一樣完成一個登入介面。 效果圖與藍圖(手繪)奉上,如下: RelativeLayout的基本屬性比較多但是不需要記憶,只要能分的清上下左右就沒問題啦。 常用屬性如下: 屬性 含義

Android基礎廣播

一、型別 標準廣播 完全非同步執行的廣播,所有廣播接收器幾乎都會同時接收到這條廣播訊息 有序廣播 同步執行的廣播,廣播接收器有先後順序 二、接收系統廣播 如何建立一個廣播接收器? 新建一個類,讓他繼承自BroadcastReceiver,並且重寫

Android基礎IO流

多謝 jametang25 和 孜燃 兩位兄弟的部落格: https://blog.csdn.net/u014529755/article/details/50984310 https://blog.csdn.net/qq_15059163/article/details/80723556

Android基礎四大元件-詳解Service

1 介紹   Service是android的一種機制。Service是執行在後臺的程式碼,不能與使用者互動,可以執行在自己的程序,也可以執行在其他應用程式的上下文裡。需要通過某一個Activity或其他Context物件來呼叫。 1.1 Servic

Android基礎Activity四種啟動模式和task相關

1 啟動模式介紹 啟動模式簡單地說就是Activity啟動時的策略,在AndroidManifest.xml中的標籤的android:launchMode屬性設定; 啟動模式有4種,分別為standard、singleTop、singleTask、singleI

Android廣播本地廣播

廣播是android是android四大元件之一,這篇文章是我學習本地廣播的記錄 本地廣播:指的是應用內廣播,只有本應用內才能監聽到的廣播,安全性比全域性廣播好很多 下面是用法: (1)傳送廣播: 1.在Activity中宣告LocalBroadcastManager類物件 pr

Android基礎ListView的使用詳解

今天給大家帶來《android應用開發全程實錄》中關於listview和adatper中的部分。包括listview的基本使用,listview的優化等。 我們經常會在應用程式中使用列表的形式來展現一些內容,所以學好ListView是非常必需的。ListView也是Android中比較難以使用的控制元件,這

Android 基礎 getTextBounds

該方法的作用時顯示字元的顯示範圍? 怎麼個顯示範圍呢?Rect rect = new Rect(); // 獲取字型的顯示範圍,這個顯示範圍是隻跟字型大小和字元長度有關的屬性 // 不管字元是否被畫出,這個顯示範圍的屬性都存在 // 可以看到getTextBounds在dra