1. 程式人生 > >android實現音樂播放器(進度條)

android實現音樂播放器(進度條)

|--效果圖

|--依賴3個物件

    MediaPlayer:實現音樂播放,暫停,緩衝。
    SeekBar:滑動的進度條。

    java.util.Timer:定時器,時時更新進度條。

|--main.xml樣式檔案

[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <spanstyle="font-size:14px;"><TextView
  2.         android:layout_width="fill_parent"
  3.         android:layout_height="wrap_content"
  4.         android:text
    ="@string/hello"/>
  5.     <EditText
  6.         android:id="@+id/mediaFileName"
  7.         android:layout_width="match_parent"
  8.         android:text="gangstabop.mp3"
  9.         android:layout_height="wrap_content">
  10.         <requestFocus/>
  11.     </EditText>
  12.     <LinearLayout
  13.         android:id="@+id/linearButton"
  14.         android:layout_width="match_parent"
  15.         android:layout_height="wrap_content">
  16.         <Button
  17.             android:id="@+id/playButton"
  18.             android:layout_width="wrap_content"
  19.             android:layout_height="wrap_content"
  20.             android:text="@string/stop"/>
  21.         <SeekBar
  22.             android:id="@+id/playSeekBar"
  23.             android:layout_width="140px"
  24.             android:layout_height="wrap_content"
  25.             android:layout_marginLeft="3px"
  26.             android:layout_marginTop="5px"/>
  27.         <Button
  28.             android:id="@+id/replayButton"
  29.             android:layout_width="wrap_content"
  30.             android:layout_height="wrap_content"
  31.             android:layout_marginLeft="3px"
  32.             android:text="@string/replay"/>
  33.     </LinearLayout></span><spanstyle="font-size: 24px;">
  34. </span>

|--Activity實現程式碼

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <span style="font-size:14px;">/** 
  2.  * @CreateDate 2015-2-3 
  3.  * @Author hubiao 
  4.  * @Title 音樂播放器 
  5.  */
  6. publicclass MediaActivity extends Activity {  
  7.     private MediaPlayer mediaPlayer;//媒體播放器
  8.     private Button playButton;  
  9.     private Button replayButton ;  
  10.     privateboolean isCellPlay;/*在結束通話電話的時候,用於判斷是否為是來電時中斷*/
  11.     privateboolean isSeekBarChanging;//互斥變數,防止進度條與定時器衝突。
  12.     privateint currentPosition;//當前音樂播放的進度
  13.     private SeekBar seekBar;  
  14.     private Timer timer;  
  15.     privatestaticfinal String TAG = "MediaActivity";  
  16.     @Override
  17.     publicvoid onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main);  
  20.         //例項化媒體播放器
  21.         mediaPlayer = new MediaPlayer();  
  22.         //監聽滾動條事件
  23.         seekBar = (SeekBar) findViewById(R.id.playSeekBar);  
  24.         seekBar.setOnSeekBarChangeListener(new MySeekBar());  
  25.         // 監聽[播放或暫停]事件
  26.         playButton= (Button) findViewById(R.id.playButton);  
  27.         playButton.setOnClickListener(new PalyListener());  
  28.         //監聽[重播]事件
  29.         replayButton= (Button) findViewById(R.id.replayButton);  
  30.         replayButton.setOnClickListener(new OnClickListener() {  
  31.             publicvoid onClick(View v) {  
  32.                 mediaPlayer.reset();  
  33.                 currentPosition = 0;  
  34.                 play();  
  35.             }  
  36.         });  
  37.         //監聽來電事件
  38.         TelephonyManager phoneyMana = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  39.         phoneyMana.listen(new myPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);  
  40.     }  
  41.     /*銷燬時釋資源*/
  42.     @Override
  43.     protectedvoid onDestroy() {  
  44.         mediaPlayer.release();  
  45.         timer.cancel();  
  46.         timer = null;  
  47.         mediaPlayer = null;  
  48.         super.onDestroy();  
  49.     }  
  50.     /*播放或暫停事件處理*/
  51.     privateclass PalyListener implements OnClickListener {  
  52.         publicvoid onClick(View v) {  
  53.             if(playButton.getText().toString().equals("播放"))  
  54.             {  
  55.                 currentPosition = mediaPlayer.getCurrentPosition();//記錄播放的位置
  56.                 mediaPlayer.stop();//暫停狀態
  57.                 playButton.setText(R.string.stop);  
  58.                 timer.purge();//移除所有任務;
  59.             }  
  60.             else{  
  61.                 mediaPlayer.reset();  
  62.                 play();  
  63.             }  
  64.         }  
  65.     }  
  66.     /*播放處理*/
  67.     privatevoid play() {  
  68.         File media = new File("/mnt/sdcard/files/","bewithyou.mp3");//由於是練習,就把mp3名稱固定了
  69.         Log.i(TAG, media.getAbsolutePath());  
  70.         if(media.exists())  
  71.         {  
  72.             try {  
  73.                 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//設定音訊型別
  74.                 mediaPlayer.setDataSource(media.getAbsolutePath());//設定mp3資料來源
  75.                 mediaPlayer.prepareAsync();//資料緩衝
  76.                 /*監聽快取 事件,在緩衝完畢後,開始播放*/
  77.                 mediaPlayer.setOnPreparedListener(new OnPreparedListener() {  
  78.                     publicvoid onPrepared(MediaPlayer mp) {  
  79.                         mp.start();   
  80.                         mp.seekTo(currentPosition);  
  81.                         playButton.setText(R.string.play);  
  82.                         seekBar.setMax(mediaPlayer.getDuration());  
  83.                     }  
  84.                 });  
  85.                 //監聽播放時回撥函式
  86.                 timer = new Timer();  
  87.                 timer.schedule(new TimerTask() {  
  88.                     @Override
  89.                     publicvoid run() {  
  90.                         if(!isSeekBarChanging){  
  91.                             seekBar.setProgress(mediaPlayer.getCurrentPosition());  
  92.                         }  
  93.                     }  
  94.                 },0,50);  
  95.             } catch (Exception e) {  
  96.                 Toast.makeText(getApplicationContext(), R.string.playError, Toast.LENGTH_LONG).show();  
  97.                 e.printStackTrace();  
  98.                 System.out.println(e);  
  99.             }  
  100.         }  
  101.         else{  
  102.             Toast.makeText(getApplicationContext(), R.string.fileError, Toast.LENGTH_LONG).show();  
  103.         }  
  104.     }  
  105.     /*來電事件處理*/
  106.     privateclass myPhoneStateListener extends PhoneStateListener  
  107.     {  
  108.         @Override
  109.         publicvoid onCallStateChanged(int state, String incomingNumber) {  
  110.         switch (state) {  
  111.             case TelephonyManager.CALL_STATE_RINGING://來電,應當停止音樂
  112.                 if(mediaPlayer.isPlaying() && playButton.getText().toString().equals("播放")){  
  113.                     currentPosition = mediaPlayer.getCurrentPosition();//記錄播放的位置
  114.                     mediaPlayer.stop();  
  115.                     isCellPlay = true;//標記這是屬於來電時暫停的標記
  116.                     playButton.setText(R.string.stop);  
  117.                     timer.purge();//移除定時器任務;
  118.                 }  
  119.                 break;  
  120.             case TelephonyManager.CALL_STATE_IDLE://無電話狀態
  121.                 if(isCellPlay){  
  122.                     isCellPlay = false;  
  123.                     mediaPlayer.reset();  
  124.                     play();  
  125.                 }  
  126.                 break;  
  127.             }  
  128.         }  
  129.     }  
  130.     /*進度條處理*/
  131.     publicclass MySeekBar implements OnSeekBarChangeListener{  
  132.         publicvoid onProgressChanged(SeekBar seekBar, int progress,  
  133.                 boolean fromUser) {  
  134.         }  
  135.         /*滾動時,應當暫停後臺定時器*/
  136.         publicvoid onStartTrackingTouch(SeekBar seekBar) {  
  137.             isSeekBarChanging = true;  
  138.         }  
  139.         /*滑動結束後,重新設定值*/
  140.         publicvoid onStopTrackingTouch(SeekBar seekBar) {  
  141.             isSeekBarChanging = false;  
  142.             mediaPlayer.seekTo(seekBar.getProgress());  
  143.         }  
  144.     }  
  145. }</span>  

|--補充    1:如果mp3在sd中,如播放失敗,是否申請sd訪問許可權或mp3檔案是否存在。    2:MediaPlayer對有個別的音訊好像不太支援,如果路徑正確,許可權具備還無法播放,就考慮下音訊問題。    3:本案例用到的許可權。 [html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <!-- 申請SD卡寫入許可權 -->
  2. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  3. <!--申請SD卡建立與許可權  -->
  4. <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  5. <!-- 攔截號碼許可權 -->
  6. <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>