android实现音乐播放器(进度条)

|--效果图

|--依赖3个对象

    MediaPlayer:实现音乐播放,暂停,缓冲。
    SeekBar:滑动的进度条。

    java.util.Timer:定时器,时时更新进度条。

|--main.xml样式文件

  1. <span style="font-size:14px;">    <TextView  
  2.         android:layout_width="fill_parent"  
  3.         android:layout_height="wrap_content"  
  4.         android:text="@string/hello" />  
  5.   
  6.     <EditText  
  7.         android:id="@+id/mediaFileName"  
  8.         android:layout_width="match_parent"  
  9.         android:text="gangstabop.mp3"  
  10.         android:layout_height="wrap_content" >  
  11.         <requestFocus />  
  12.     </EditText>  
  13.   
  14.   
  15.     <LinearLayout  
  16.         android:id="@+id/linearButton"  
  17.         android:layout_width="match_parent"  
  18.         android:layout_height="wrap_content" >  
  19.   
  20.         <Button  
  21.             android:id="@+id/playButton"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:text="@string/stop" />  
  25.   
  26.         <SeekBar  
  27.             android:id="@+id/playSeekBar"  
  28.             android:layout_width="140px"  
  29.             android:layout_height="wrap_content"  
  30.             android:layout_marginLeft="3px"  
  31.             android:layout_marginTop="5px" />  
  32.   
  33.         <Button  
  34.             android:id="@+id/replayButton"  
  35.             android:layout_width="wrap_content"  
  36.             android:layout_height="wrap_content"  
  37.             android:layout_marginLeft="3px"  
  38.             android:text="@string/replay" />  
  39.     </LinearLayout></span><span style="font-size: 24px;">  
  40. </span>  

|--Activity实现代码

  1. <span style="font-size:14px;">/** 
  2.  * @CreateDate 2015-2-3 
  3.  * @Author hubiao 
  4.  * @Title 音乐播放器 
  5.  */  
  6. public class MediaActivity extends Activity {  
  7.     private MediaPlayer mediaPlayer;//媒体播放器  
  8.     private Button playButton;  
  9.     private Button replayButton ;  
  10.     private boolean isCellPlay;/*在挂断电话的时候,用于判断是否为是来电时中断*/  
  11.     private boolean isSeekBarChanging;//互斥变量,防止进度条与定时器冲突。  
  12.     private int currentPosition;//当前音乐播放的进度  
  13.     private SeekBar seekBar;  
  14.     private Timer timer;  
  15.       
  16.     private static final String TAG = "MediaActivity";  
  17.       
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.   
  23.         //实例化媒体播放器  
  24.         mediaPlayer = new MediaPlayer();  
  25.           
  26.         //监听滚动条事件  
  27.         seekBar = (SeekBar) findViewById(R.id.playSeekBar);  
  28.         seekBar.setOnSeekBarChangeListener(new MySeekBar());  
  29.           
  30.         // 监听[播放或暂停]事件  
  31.         playButton= (Button) findViewById(R.id.playButton);  
  32.         playButton.setOnClickListener(new PalyListener());  
  33.           
  34.         //监听[重播]事件  
  35.         replayButton= (Button) findViewById(R.id.replayButton);  
  36.         replayButton.setOnClickListener(new OnClickListener() {  
  37.             public void onClick(View v) {  
  38.                 mediaPlayer.reset();  
  39.                 currentPosition = 0;  
  40.                 play();  
  41.             }  
  42.         });  
  43.           
  44.         //监听来电事件  
  45.         TelephonyManager phoneyMana = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  46.         phoneyMana.listen(new myPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);  
  47.     }  
  48.     /*销毁时释资源*/  
  49.     @Override  
  50.     protected void onDestroy() {  
  51.         mediaPlayer.release();  
  52.         timer.cancel();  
  53.         timer = null;  
  54.         mediaPlayer = null;  
  55.         super.onDestroy();  
  56.     }  
  57.       
  58.     /*播放或暂停事件处理*/  
  59.     private class PalyListener implements OnClickListener {  
  60.         public void onClick(View v) {  
  61.             if(playButton.getText().toString().equals("播放"))  
  62.             {  
  63.                 currentPosition = mediaPlayer.getCurrentPosition();//记录播放的位置  
  64.                 mediaPlayer.stop();//暂停状态  
  65.                 playButton.setText(R.string.stop);  
  66.                 timer.purge();//移除所有任务;  
  67.             }  
  68.             else{  
  69.                 mediaPlayer.reset();  
  70.                 play();  
  71.             }  
  72.         }  
  73.     }  
  74.       
  75.     /*播放处理*/  
  76.     private void play() {  
  77.         File media = new File("/mnt/sdcard/files/","bewithyou.mp3");//由于是练习,就把mp3名称固定了  
  78.         Log.i(TAG, media.getAbsolutePath());  
  79.         if(media.exists())  
  80.         {  
  81.             try {  
  82.                 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置音频类型  
  83.                 mediaPlayer.setDataSource(media.getAbsolutePath());//设置mp3数据源  
  84.                 mediaPlayer.prepareAsync();//数据缓冲  
  85.                 /*监听缓存 事件,在缓冲完毕后,开始播放*/  
  86.                 mediaPlayer.setOnPreparedListener(new OnPreparedListener() {  
  87.                     public void onPrepared(MediaPlayer mp) {  
  88.                         mp.start();   
  89.                         mp.seekTo(currentPosition);  
  90.                         playButton.setText(R.string.play);  
  91.                         seekBar.setMax(mediaPlayer.getDuration());  
  92.                     }  
  93.                 });  
  94.                 //监听播放时回调函数  
  95.                 timer = new Timer();  
  96.                 timer.schedule(new TimerTask() {  
  97.                     @Override  
  98.                     public void run() {  
  99.                         if(!isSeekBarChanging){  
  100.                             seekBar.setProgress(mediaPlayer.getCurrentPosition());  
  101.                         }  
  102.                     }  
  103.                 },0,50);  
  104.             } catch (Exception e) {  
  105.                 Toast.makeText(getApplicationContext(), R.string.playError, Toast.LENGTH_LONG).show();  
  106.                 e.printStackTrace();  
  107.                 System.out.println(e);  
  108.             }  
  109.         }  
  110.         else{  
  111.             Toast.makeText(getApplicationContext(), R.string.fileError, Toast.LENGTH_LONG).show();  
  112.         }  
  113.     }  
  114.       
  115.     /*来电事件处理*/  
  116.     private class myPhoneStateListener extends PhoneStateListener  
  117.     {  
  118.         @Override  
  119.         public void onCallStateChanged(int state, String incomingNumber) {  
  120.         switch (state) {  
  121.             case TelephonyManager.CALL_STATE_RINGING://来电,应当停止音乐  
  122.                 if(mediaPlayer.isPlaying() && playButton.getText().toString().equals("播放")){  
  123.                     currentPosition = mediaPlayer.getCurrentPosition();//记录播放的位置  
  124.                     mediaPlayer.stop();  
  125.                     isCellPlay = true;//标记这是属于来电时暂停的标记  
  126.                     playButton.setText(R.string.stop);  
  127.                     timer.purge();//移除定时器任务;  
  128.                 }  
  129.                 break;  
  130.             case TelephonyManager.CALL_STATE_IDLE://无电话状态  
  131.                 if(isCellPlay){  
  132.                     isCellPlay = false;  
  133.                     mediaPlayer.reset();  
  134.                     play();  
  135.                 }  
  136.                 break;  
  137.             }  
  138.         }  
  139.     }  
  140.       
  141.     /*进度条处理*/  
  142.     public class MySeekBar implements OnSeekBarChangeListener{  
  143.   
  144.         public void onProgressChanged(SeekBar seekBar, int progress,  
  145.                 boolean fromUser) {  
  146.         }  
  147.   
  148.         /*滚动时,应当暂停后台定时器*/  
  149.         public void onStartTrackingTouch(SeekBar seekBar) {  
  150.             isSeekBarChanging = true;  
  151.         }  
  152.         /*滑动结束后,重新设置值*/  
  153.         public void onStopTrackingTouch(SeekBar seekBar) {  
  154.             isSeekBarChanging = false;  
  155.             mediaPlayer.seekTo(seekBar.getProgress());  
  156.         }  
  157.     }  
  158. }</span>  

|--补充
   1:如果mp3在sd中,如播放失败,是否申请sd访问权限或mp3文件是否存在。
   2:MediaPlayer对有个别的音频好像不太支持,如果路径正确,权限具备还无法播放,就考虑下音频问题。
   3:本案例用到的权限。
  1. <!-- 申请SD卡写入权限 -->  
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  3. <!--申请SD卡创建与权限  -->  
  4. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  
  5. <!-- 拦截号码权限 -->  
  6. <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
展开阅读全文

没有更多推荐了,返回首页