Android实现音乐后台播放
2015-07-04 12:08
846 查看
Service是一个生命周期长且没有用户界面的程序,当程序在各个activity中切换的时候,我们可以利用service来实现背景音乐的播放,即使当程序退出到后台的时候,音乐依然在播放。
实现代码如下:
(1)src/.../MainActivity.java
实现代码如下:
(1)src/.../MainActivity.java
public class MainActivity extends Activity implements OnClickListener { private Button mBtnPrevious; // 上一首 private Button mBtnPlay; // 播放 private Button mBtnNext; // 下一首 private Button mBtnPause; // 暂停 private ComponentName component; // 用于启动服务 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 得到布局中的控件 findView(); // 绑定控件事件 setListener(); } // 得到布局中的控件 private void findView() { component = new ComponentName(this, MusicService.class); mBtnPrevious = (Button) findViewById(R.id.previous); mBtnPlay = (Button) findViewById(R.id.play); mBtnNext = (Button) findViewById(R.id.next); mBtnPause = (Button) findViewById(R.id.pause); } // 绑定控件事件 private void setListener() { mBtnPrevious.setOnClickListener(this); mBtnPlay.setOnClickListener(this); mBtnNext.setOnClickListener(this); mBtnPause.setOnClickListener(this); } // 按钮点击事件响应 public void onClick(View v) { // 如果点击前一首歌,就在intent中传递前一首歌参数 if (v == mBtnPrevious) { Intent mIntent = new Intent(MusicService.PREVIOUS_ACTION); mIntent.setComponent(component); startService(mIntent); // 如果点击前播放歌曲,就在intent中传递播放当前歌参数 } else if (v == mBtnPlay) { Intent mIntent = new Intent(MusicService.PLAY_ACTION); mIntent.setComponent(component); startService(mIntent); // 如果点击前一首歌,就在intent中传递下一首歌参数 } else if (v == mBtnNext) { Intent mIntent = new Intent(MusicService.NEXT_ACTION); mIntent.setComponent(component); startService(mIntent); // 如果点击前一首歌,就在intent中传递暂停首歌参数 } else { Intent mIntent = new Intent(MusicService.PAUSE_ACTION); mIntent.setComponent(component); startService(mIntent); } } }(2) src/.../MusicService.java
public class MusicService extends Service { // 定义需要显示的音乐的字段 String[] mCursorCols = new String[] { "audio._id AS _id", // index must match IDCOLIDX below MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.ARTIST_ID, MediaStore.Audio.Media.DURATION }; private MediaPlayer mMediaPlayer; // 声明播放器 private Cursor mCursor; // 声明游标 private int mPlayPosition = 0; // 当前播放的歌曲 // 注册意图 public static final String PLAY_ACTION = "com.wyl.music.PLAY_ACTION"; public static final String PAUSE_ACTION = "com.wyl.music.PAUSE_ACTION"; public static final String NEXT_ACTION = "com.wyl.music.NEXT_ACTION"; public static final String PREVIOUS_ACTION = "com.wyl.music.PREVIOUS_ACTION"; @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { super.onCreate(); mMediaPlayer = new MediaPlayer(); // 通过一个URI可以获取所有音频文件 Uri MUSIC_URL = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; // 这里我过滤了一下,因为我机里有些音频文件是游戏音频,很短 // 我这里作了处理,默认大于10秒的可以看作是系统音乐 mCursor = getContentResolver().query(MUSIC_URL, mCursorCols, "duration > 10000", null, null); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); // 根据不同的action,做不同的相应 String action = intent.getAction(); //播放 if (action.equals(PLAY_ACTION)) { play(); //暂停 } else if (action.equals(PAUSE_ACTION)) { pause(); //下一首 } else if (action.equals(NEXT_ACTION)) { next(); //前一首 } else if (action.equals(PREVIOUS_ACTION)) { previous(); } } // 播放音乐 public void play() { //初始化音乐播放器 inite(); } // 暂停时,结束服务 public void pause() { //暂停音乐播放 stopSelf(); } // 上一首 public void previous() { //得到前一首的歌曲 if (mPlayPosition == 0) { mPlayPosition = mCursor.getCount() - 1; } else { mPlayPosition--; } //开始播放 inite(); } // 下一首 public void next() { //得到后一首歌曲 if (mPlayPosition == mCursor.getCount() - 1) { mPlayPosition = 0; } else { mPlayPosition++; } //开始播放 inite(); } // 初始化播放器 public void inite() { //充值MediaPlayer mMediaPlayer.reset(); // 获取歌曲位置 String dataSource = getDateByPosition(mCursor, mPlayPosition); // 歌曲信息 String info = getInfoByPosition(mCursor, mPlayPosition); // 用Toast显示歌曲信息 Toast.makeText(getApplicationContext(), info, Toast.LENGTH_SHORT) .show(); try { // 播放器绑定资源 mMediaPlayer.setDataSource(dataSource); // 播放器准备 mMediaPlayer.prepare(); // 播放 mMediaPlayer.start(); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (IllegalStateException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } // 根据位置来获取歌曲位置 public String getDateByPosition(Cursor c, int position) { c.moveToPosition(position); int dataColumn = c.getColumnIndex(MediaStore.Audio.Media.DATA); String data = c.getString(dataColumn); return data; } // 获取当前播放歌曲演唱者及歌名 public String getInfoByPosition(Cursor c, int position) { c.moveToPosition(position); int titleColumn = c.getColumnIndex(MediaStore.Audio.Media.TITLE); int artistColumn = c.getColumnIndex(MediaStore.Audio.Media.ARTIST); String info = c.getString(artistColumn) + " " + c.getString(titleColumn); return info; } // 服务结束时要释放MediaPlayer public void onDestroy() { super.onDestroy(); mMediaPlayer.release(); } }
相关文章推荐
- Android中系统存储 Settings
- Android IOS WebRTC 音视频开发总结(三一)-- 自定义传输实现一对多
- Android ListView使用详解
- 暑假计划
- Android中数据库的创建和使用
- Android Studio中使用volley请求数据后返回数据显示乱码的问题
- Android的v7包中的新控件——(二)RecyclerView(超级 listview,传说会代替listview)
- Android闹钟程序
- Android 官方百分比适配库
- Android之ScrollView嵌套ListView冲突
- 谈谈Android 程序框架设计
- Android基于发展Service音乐播放器
- Gson 使用
- Android--AIDL,一种实现进程间通信的方式
- android生成apk包出现Unable to add "XXX" Zip add failed问题
- Android开发学习总结(二)——使用Android Studio搭建Android集成开发环境
- Android开发之BroadcastReceiver详解
- android 中使用View.setId(int id),如何避免id冲突呢?
- Android Intent Action 大全
- 教你来彻底理解ldpi、mdpi、hdpi、xhdpi、xxhdpi