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