为简单音频播放对MediaPlayer的简单封装

目前只有简单音频播放需求,暂时封装到这样,以后需求变了,再扩展吧

类:

  1 import android.media.AudioManager;
  2 import android.media.MediaPlayer;
  3 import android.support.annotation.FloatRange;
  4 import android.support.annotation.NonNull;
  5 import android.support.annotation.Nullable;
  6 import android.util.Log;
  7 
  8 import java.io.IOException;
  9 import java.util.HashMap;
 10 import java.util.Map;
 11 
 12 import static com.xhzxlqt.util.LeesAudioPlayer.Status.STATUS_COMPLETE;
 13 import static com.xhzxlqt.util.LeesAudioPlayer.Status.STATUS_ERROR;
 14 import static com.xhzxlqt.util.LeesAudioPlayer.Status.STATUS_NULL;
 15 import static com.xhzxlqt.util.LeesAudioPlayer.Status.STATUS_PAUSE;
 16 import static com.xhzxlqt.util.LeesAudioPlayer.Status.STATUS_PLAYING;
 17 import static com.xhzxlqt.util.LeesAudioPlayer.Status.STATUS_READY;
 18 import static com.xhzxlqt.util.LeesAudioPlayer.Status.STATUS_STOP;
 19 
 20 /*
 21  * @author [email protected]
 22  * create at 2018/6/13
 23  * description:
 24  */
 25 public class LeesAudioPlayer  {
 26     static String TAG="LeesAudioPlayerThread";
 27     MediaPlayer mPlayer=new MediaPlayer();
 28     LeesAudioPlayer _this;
 29     float   _Volume=0.5f;
 30 
 31     int _currentStatus=STATUS_NULL;
 32 
 33     //使用Map,而不使用固定变量,方便以后扩展Status
 34     private Map<Integer,OnStatusChangedListener> listenerMap=new HashMap<Integer,OnStatusChangedListener>();
 35 
 36     public LeesAudioPlayer(){
 37         _this=this;
 38         mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
 39         mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
 40 
 41             @Override
 42             public void onPrepared(MediaPlayer mp) {
 43                 setCurrentStatus(STATUS_READY,mp.getDuration());
 44                 //region
 45                 mp.setVolume(_Volume,_Volume);
 46                 mp.start();
 47                 setCurrentStatus(STATUS_PLAYING,null);
 48                 //endregion
 49             }
 50 
 51         });
 52 
 53         mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
 54             @Override
 55             public boolean onError(MediaPlayer mp, int what, int extra) {
 56                 if(mPlayer.isPlaying()) {
 57                     mPlayer.stop();
 58                     setCurrentStatus(STATUS_STOP,null);
 59                 }
 60                 setCurrentStatus(STATUS_ERROR,null);
 61                 return false;
 62             }
 63         });
 64 
 65         mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
 66             @Override
 67             public void onCompletion(MediaPlayer mp) {
 68                 //region
 69                 setCurrentStatus(STATUS_COMPLETE,null);
 70                 //endregion
 71             }
 72         });
 73     }
 74     /*
 75      * 函数功能:播放音频文件
 76      * Author: [email protected]
 77      * Create: 2018/6/13 20:11
 78      *
 79      */
 80     public void Play(String sFile) {
 81         try {
 82             if(mPlayer.isPlaying()){
 83                 mPlayer.stop();
 84                 setCurrentStatus(STATUS_STOP,null);
 85             }
 86             mPlayer.reset();
 87             mPlayer.setDataSource(sFile);
 88             mPlayer.prepareAsync();
 89         }
 90         catch (IOException e){
 91             Log.e(TAG,e.getMessage());
 92         }
 93     }
 94     /*
 95      * 函数功能:设置音量
 96      * Author: [email protected]
 97      * Create: 2018/6/13 20:17
 98      *
 99      */
100     public void setVolume(@FloatRange( from = 0.0f ,to =1.0f) float fVal){
101         _Volume=fVal;
102     }
103     /*
104      * 函数功能:暂停
105      * Author: [email protected]
106      * Create: 2018/6/13 20:18
107      *
108      */
109     public void Pause(){
110         if(mPlayer.isPlaying()){
111             setCurrentStatus(STATUS_PAUSE,null);
112             mPlayer.pause();
113         }
114     }
115     /*
116      * 函数功能:恢复播放
117      * Author: [email protected]
118      * Create: 2018/6/13 20:41
119      *
120      */
121     public void Resume(){
122         if(_currentStatus==STATUS_PAUSE) {
123             setCurrentStatus(STATUS_PLAYING,null);
124             mPlayer.start();
125         }
126     }
127 
128     /*
129      * 函数功能:设置当前状态,同时调用相应的回调(如果有)
130      * Author: [email protected]
131      * Create: 2018/6/13 20:46
132      *
133      */
134     private void setCurrentStatus(int nVal,Object obj){
135         _currentStatus=nVal;
136         if(listenerMap.containsKey(nVal)){
137             OnStatusChangedListener listener=listenerMap.get(nVal);
138             if(listener!=null){
139                 listener.onStatusChanged(_this, nVal,obj);
140             }
141         }
142     }
143 
144 
145     public interface Status{
146         public int STATUS_NULL=0;
147         public int STATUS_READY=1;
148         public int STATUS_PLAYING=2;
149         public int STATUS_PAUSE=3;
150         public int STATUS_COMPLETE=4;
151         public int STATUS_STOP=5;
152         public int STATUS_ERROR=9;
153     }
154     public interface OnStatusChangedListener{
155         public void onStatusChanged(LeesAudioPlayer lapt, int status, @Nullable Object other);
156     }
157     public LeesAudioPlayer setStatusChangedListener(@NonNull int nStatus, OnStatusChangedListener listener){
158         listenerMap.put(nStatus,listener);
159         return this;
160     }
161     protected void finalize( )
162     {
163         if(mPlayer.isPlaying())
164             mPlayer.stop();
165         mPlayer.release();
166         mPlayer=null;
167     }
168 }
View Code

调用测试:

 1 LeesAudioPlayer mPlayer=new LeesAudioPlayer();
 2 
 3 
 4 mPlayer.setStatusChangedListener(LeesAudioPlayer.Status.STATUS_READY, new LeesAudioPlayer.OnStatusChangedListener() {
 5             @Override
 6             public void onStatusChanged(LeesAudioPlayer lapt, int status, @Nullable Object msg) {
 7                 onPlayerStatusChanged(lapt,status,msg);
 8             }
 9         }).setStatusChangedListener(LeesAudioPlayer.Status.STATUS_COMPLETE, new LeesAudioPlayer.OnStatusChangedListener() {
10             @Override
11             public void onStatusChanged(LeesAudioPlayer lapt, int status, @Nullable Object msg) {
12                 onPlayerStatusChanged(lapt,status,msg);
13             }
14         }).setStatusChangedListener(LeesAudioPlayer.Status.STATUS_ERROR, new LeesAudioPlayer.OnStatusChangedListener() {
15             @Override
16             public void onStatusChanged(LeesAudioPlayer lapt, int status, @Nullable Object msg) {
17                 onPlayerStatusChanged(lapt,status,msg);
18             }
19         });
20         btn1=(Button)findViewById(R.id.btn_1);
21         btn2=(Button)findViewById(R.id.btn_2);
22         btn1.setOnClickListener(new View.OnClickListener() {
23             @Override
24             public void onClick(View v) {
25                 mPlayer.Play("/storage/emulated/0/mp3/白狐_陈瑞_女人心.mp3");
26             }
27         });
28         btn2.setOnClickListener(new View.OnClickListener() {
29             @Override
30             public void onClick(View v) {
31                 mPlayer.Play("/storage/emulated/0/mp3/孙露-难舍难分.mp3");
32             }
33         });
34 
35 ........
36 
37 private void onPlayerStatusChanged(LeesAudioPlayer lapt, int status, @Nullable Object msg){
38         switch (status){
39             case LeesAudioPlayer.Status.STATUS_READY:
40                 gifImageView.setImageResource(R.drawable.sound_play);
41                 break;
42             case LeesAudioPlayer.Status.STATUS_COMPLETE:
43                 gifImageView.setImageResource(R.drawable.sound_stop);
44                 break;
45             case LeesAudioPlayer.Status.STATUS_ERROR:
46                 gifImageView.setImageResource(R.drawable.sound_stop);
47                 break;
48         }
49     }
View Code

猜你喜欢

转载自www.cnblogs.com/xhzxlqt/p/9179974.html