Music
2015-07-01 18:06
281 查看
一般的Android应用程序的音乐可以分为背景音乐和点击各种控件时的音效,前者一般为比较大的音乐文件,后者一般为比较小的音乐。在Android中一般用MediaPlayer类处理比较大的音频文件,用SoundPool类处理比较短促的音频文件。
因此,现设计一音乐播放工具类如下: MusicPlayer
在activity中怎样使用这个工具类呢?播放背景音乐可能我们一般都想到的是service,但是service对背景音乐的控制比较难,尤其是,在不同场景,需要不时变换背景音乐的情况下,因此,可以考虑自己定义一个activity,继承Activity,在其中定义一个静态的成员变量public static MusicPlayer musicPlayer;
并在这个Activity的onCreate方法中初始化该musicPlayer
然后,再将所有的Activity继承于这个自己定义的Activity即可。
下面用一个例子进行加深理解:
实现效果如下图:
![](http://images0.cnblogs.com/blog2015/697247/201507/011756507817358.png)
1:由于布局相对简单,这里不再进行阐述。
2:需要新建一个Servicem,自定义服务类,用于获取音频数据,并且调用方法,根据音频位置进行播放。
3:MainActivity:(写明点击不同按钮时候的事件,对应作出的处理,设置相应的单机监听事件,通过不同的按钮单击传递不同的参数给Service.)
因此,现设计一音乐播放工具类如下: MusicPlayer
import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.SoundPool; import com.ruanko.shengji4Android.R; import com.ruanko.shengji4Android.model.SysSetting; public class MusicPlayer implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener { private Context context; private MediaPlayer bgPlayer; //播放背景音乐的播放器 private SoundPool actionMusicPlayer; //播放音效的播放器 private int source_da,source_givecard,source_start,source_win,source_calllord; //各种音效的source public MusicPlayer(Context context) { //初始化 this.context = context; this.actionMusicPlayer = new SoundPool(10, AudioManager.STREAM_SYSTEM,5); //这里指定声音池的最大音频流数目为10,声音品质为5大家可以自己测试感受下效果 this.source_da = actionMusicPlayer.load(context, R.raw.da, 0); this.source_givecard = actionMusicPlayer.load(context, R.raw.givecard, 0); this.source_start = actionMusicPlayer.load(context, R.raw.start, 0); this.source_win = actionMusicPlayer.load(context, R.raw.win, 0); this.source_calllord = actionMusicPlayer.load(context, R.raw.calllord, 0); } public void onCompletion(MediaPlayer mp) { //音频文件播放完成时自动调用 } public boolean onError(MediaPlayer mp, int what, int extra) { //音频文件播放发生错误时自动调用 return false; } public void playBgSound(int paramInt) { //播放背景音乐,paramInt为音频文件ID if(!SysSetting.getInstance(context).isBgSound()) { //SysSetting为一个单例类,是我自己定义的,用于保存本应用程序相关设置,isBgSound()为得到是否开启背景音乐设置 return; } stopSound(bgPlayer); try { MediaPlayer mediaPlayer = MediaPlayer.create(context, paramInt); bgPlayer = mediaPlayer; bgPlayer.setOnCompletionListener(this); bgPlayer.setLooping(true); //设置是否循环,一般背景音乐都设为true bgPlayer.start(); } catch (IllegalStateException e) { e.printStackTrace(); } } public MediaPlayer getBackGroundPlayer() { return this.bgPlayer; } public void stopBgSound() { //停止背景音乐的播放 if(bgPlayer == null) return; if(bgPlayer.isPlaying()) bgPlayer.stop(); bgPlayer.release(); bgPlayer = null; } private void playSound(int source) { //如果系统设置中开启了音效,则播放相关的音频文件 if(SysSetting.getInstance(context).isEffectSound()) { actionMusicPlayer.play(source, 1, 1, 0, 0, 1); } } public void playHitCardSound() { playSound(source_da); } public void playGiveCardSound() { playSound(source_givecard); } public void playStartSound() { playSound(source_start); } public void playWinSound() { playSound(source_win); } public void playCalllordSound() { playSound(source_calllord); } }
在activity中怎样使用这个工具类呢?播放背景音乐可能我们一般都想到的是service,但是service对背景音乐的控制比较难,尤其是,在不同场景,需要不时变换背景音乐的情况下,因此,可以考虑自己定义一个activity,继承Activity,在其中定义一个静态的成员变量public static MusicPlayer musicPlayer;
并在这个Activity的onCreate方法中初始化该musicPlayer
if(musicPlayer == null) { SysSetting.getInstance(getApplicationContext()).load(); //加载系统设置,SysSetting为我自己定义的一个类,由于代码较长,就不给出了 musicPlayer = new MusicPlayer(getApplicationContext()); musicPlayer.playBgSound(R.raw.welcome); //播放背景音乐 }
然后,再将所有的Activity继承于这个自己定义的Activity即可。
下面用一个例子进行加深理解:
实现效果如下图:
![](http://images0.cnblogs.com/blog2015/697247/201507/011756507817358.png)
1:由于布局相对简单,这里不再进行阐述。
2:需要新建一个Servicem,自定义服务类,用于获取音频数据,并且调用方法,根据音频位置进行播放。
package com.bzu.xuyinghui; import java.io.IOException; import android.app.Service; import android.content.Intent; import android.database.Cursor; import android.media.MediaPlayer; import android.net.Uri; import android.os.IBinder; import android.provider.MediaStore; import android.widget.Toast; //定义音乐服务类 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 MUSIC_URL = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;// 通过一个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(); } }
3:MainActivity:(写明点击不同按钮时候的事件,对应作出的处理,设置相应的单机监听事件,通过不同的按钮单击传递不同的参数给Service.)
package com.bzu.xuyinghui; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; //定义了本实例的主要Activity 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); } // 按钮点击事件响应 45 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); } } }
相关文章推荐
- Android listview中使用checkbox
- Codeforces Round #311 (Div. 2)
- 【Android】【Framework】ActivityThread相关
- 【Android】【Framework】ActivityThread相关
- 【Android】【Framework】ActivityThread相关
- 【Android】【Framework】ActivityThread相关
- 【Android】【Framework】ActivityThread相关
- 【Android】【Framework】ActivityThread相关
- 【Android】【Framework】ActivityThread相关
- fxpyxphremtv
- cocos2d-x3.x+Lua开发工具
- BZOJ 2440 [中山市选2011]完全平方数 【莫比乌斯反演】
- Algorithms—168.Excel Sheet Column Title
- windows 7Z命令行与安装
- jquery获取当前时间
- EditText无法获取焦点 获取焦点无法编辑(android:descendantFocusability用法简析 )
- 听课练习(一)
- C++primer书店程序
- 带有附件的上传,下载,一个多个附件的上传,下载及测试类
- Selenium - CSS Selector