Android基础之本地音乐后台播放

来源:互联网 发布:淘宝管控记录怎么申诉 编辑:程序博客网 时间:2024/05/17 05:08

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用service后台播放音乐,弹出通知

public class MainActivity extends Activity {private MusicAdpater adapter;private IMusicPlay mMusicPlay;private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mMusicPlay = (IMusicPlay) service;}};@Overrideprotected 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() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {mMusicPlay.callPlayMusic(adapter.getDatas(),position);}});}//设置播放的模式@Overridepublic 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);//退出activityfinish();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();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// LayoutInflater 可以将一个布局转换成View// MenuInflater 可以将一个菜单栏布局转换成菜单的ViewgetMenuInflater().inflate(R.menu.main, menu);// true 告诉系统 菜单栏我们自己处理就可以了return true;}}


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

public class MusicAdpater extends BaseAdapter{private ArrayList<String> mMusicPaths;@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mMusicPaths==null?0:mMusicPaths.size();}public void setDatas(ArrayList<String> mMusicPaths) {// this.mMusicPaths=mMusicPaths;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubif (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;}@Overridepublic String getItem(int position) {// TODO Auto-generated method stubreturn mMusicPaths.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}public ArrayList<String> getDatas() {// TODO Auto-generated method stubreturn mMusicPaths;}}*******************************************************************************************************************public class MusicPlayService extends Service {private MediaPlayer mediaPlayer;private int currentMusicImndex;private NotificationManager mManager;private class MusicPlayServiceAgent extends Binder implements IMusicPlay {@Overridepublic void callPlayMusic(ArrayList<String> mMusicPaths, int musicIndex) {//playMusic(mMusicPaths, musicIndex);}@Overridepublic void callStopPlay() {// TODO Auto-generated method stubstopPlay();}}@Overridepublic 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() {@Overridepublic 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获取缓存Viewpublic 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"/>


原创粉丝点击