国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

android實(shí)現(xiàn)音樂(lè)播放器進(jìn)度條效果

2019-10-22 18:12:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例為大家分享了android實(shí)現(xiàn)音樂(lè)播放器進(jìn)度條效果的具體代碼,供大家參考,具體內(nèi)容如下

效果圖

android,音樂(lè)播放器,進(jìn)度條

依賴3個(gè)對(duì)象

MediaPlayer:實(shí)現(xiàn)音樂(lè)播放,暫停,緩沖。

SeekBar:滑動(dòng)的進(jìn)度條。

java.util.Timer:定時(shí)器,時(shí)時(shí)更新進(jìn)度條。

main.xml樣式文件

<TextView  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:text="@string/hello" />   <EditText  android:id="@+id/mediaFileName"  android:layout_width="match_parent"  android:text="gangstabop.mp3"  android:layout_height="wrap_content" >  <requestFocus />  </EditText>    <LinearLayout  android:id="@+id/linearButton"  android:layout_width="match_parent"  android:layout_height="wrap_content" >   <Button   android:id="@+id/playButton"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:text="@string/stop" />   <SeekBar   android:id="@+id/playSeekBar"   android:layout_width="140px"   android:layout_height="wrap_content"   android:layout_marginLeft="3px"   android:layout_marginTop="5px" />   <Button   android:id="@+id/replayButton"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_marginLeft="3px"   android:text="@string/replay" />  </LinearLayout>

Activity實(shí)現(xiàn)代碼

/**  * @CreateDate 2015-2-3  * @Author hubiao  * @Title 音樂(lè)播放器  */ public class MediaActivity extends Activity {  private MediaPlayer mediaPlayer;//媒體播放器  private Button playButton;  private Button replayButton ;  private boolean isCellPlay;/*在掛斷電話的時(shí)候,用于判斷是否為是來(lái)電時(shí)中斷*/  private boolean isSeekBarChanging;//互斥變量,防止進(jìn)度條與定時(shí)器沖突。  private int currentPosition;//當(dāng)前音樂(lè)播放的進(jìn)度  private SeekBar seekBar;  private Timer timer;   private static final String TAG = "MediaActivity";   @Override  public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);   //實(shí)例化媒體播放器  mediaPlayer = new MediaPlayer();    //監(jiān)聽(tīng)滾動(dòng)條事件  seekBar = (SeekBar) findViewById(R.id.playSeekBar);  seekBar.setOnSeekBarChangeListener(new MySeekBar());    // 監(jiān)聽(tīng)[播放或暫停]事件  playButton= (Button) findViewById(R.id.playButton);  playButton.setOnClickListener(new PalyListener());    //監(jiān)聽(tīng)[重播]事件  replayButton= (Button) findViewById(R.id.replayButton);  replayButton.setOnClickListener(new OnClickListener() {   public void onClick(View v) {   mediaPlayer.reset();   currentPosition = 0;   play();   }  });    //監(jiān)聽(tīng)來(lái)電事件  TelephonyManager phoneyMana = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  phoneyMana.listen(new myPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);  }  /*銷毀時(shí)釋資源*/  @Override  protected void onDestroy() {  mediaPlayer.release();  timer.cancel();  timer = null;  mediaPlayer = null;  super.onDestroy();  }   /*播放或暫停事件處理*/  private class PalyListener implements OnClickListener {  public void onClick(View v) {   if(playButton.getText().toString().equals("播放"))   {   currentPosition = mediaPlayer.getCurrentPosition();//記錄播放的位置   mediaPlayer.stop();//暫停狀態(tài)   playButton.setText(R.string.stop);   timer.purge();//移除所有任務(wù);   }   else{   mediaPlayer.reset();   play();   }  }  }   /*播放處理*/  private void play() {  File media = new File("/mnt/sdcard/files/","bewithyou.mp3");//由于是練習(xí),就把mp3名稱固定了  Log.i(TAG, media.getAbsolutePath());  if(media.exists())  {   try {   mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//設(shè)置音頻類型   mediaPlayer.setDataSource(media.getAbsolutePath());//設(shè)置mp3數(shù)據(jù)源   mediaPlayer.prepareAsync();//數(shù)據(jù)緩沖   /*監(jiān)聽(tīng)緩存 事件,在緩沖完畢后,開(kāi)始播放*/   mediaPlayer.setOnPreparedListener(new OnPreparedListener() {    public void onPrepared(MediaPlayer mp) {    mp.start();    mp.seekTo(currentPosition);    playButton.setText(R.string.play);    seekBar.setMax(mediaPlayer.getDuration());    }   });   //監(jiān)聽(tīng)播放時(shí)回調(diào)函數(shù)   timer = new Timer();   timer.schedule(new TimerTask() {    @Override    public void run() {    if(!isSeekBarChanging){     seekBar.setProgress(mediaPlayer.getCurrentPosition());    }    }   },0,50);   } catch (Exception e) {   Toast.makeText(getApplicationContext(), R.string.playError, Toast.LENGTH_LONG).show();   e.printStackTrace();   System.out.println(e);   }  }  else{   Toast.makeText(getApplicationContext(), R.string.fileError, Toast.LENGTH_LONG).show();  }  }   /*來(lái)電事件處理*/  private class myPhoneStateListener extends PhoneStateListener  {  @Override  public void onCallStateChanged(int state, String incomingNumber) {  switch (state) {   case TelephonyManager.CALL_STATE_RINGING://來(lái)電,應(yīng)當(dāng)停止音樂(lè)   if(mediaPlayer.isPlaying() && playButton.getText().toString().equals("播放")){    currentPosition = mediaPlayer.getCurrentPosition();//記錄播放的位置    mediaPlayer.stop();    isCellPlay = true;//標(biāo)記這是屬于來(lái)電時(shí)暫停的標(biāo)記    playButton.setText(R.string.stop);    timer.purge();//移除定時(shí)器任務(wù);   }   break;   case TelephonyManager.CALL_STATE_IDLE://無(wú)電話狀態(tài)   if(isCellPlay){    isCellPlay = false;    mediaPlayer.reset();    play();   }   break;   }  }  }   /*進(jìn)度條處理*/  public class MySeekBar implements OnSeekBarChangeListener{   public void onProgressChanged(SeekBar seekBar, int progress,   boolean fromUser) {  }   /*滾動(dòng)時(shí),應(yīng)當(dāng)暫停后臺(tái)定時(shí)器*/  public void onStartTrackingTouch(SeekBar seekBar) {   isSeekBarChanging = true;  }  /*滑動(dòng)結(jié)束后,重新設(shè)置值*/  public void onStopTrackingTouch(SeekBar seekBar) {   isSeekBarChanging = false;   mediaPlayer.seekTo(seekBar.getProgress());  }  } } 

補(bǔ)充:

1.如果mp3在sd中,如播放失敗,是否申請(qǐng)sd訪問(wèn)權(quán)限或mp3文件是否存在。
2.MediaPlayer對(duì)有個(gè)別的音頻好像不太支持,如果路徑正確,權(quán)限具備還無(wú)法播放,就考慮下音頻問(wèn)題。
3.本案例用到的權(quán)限。

<!-- 申請(qǐng)SD卡寫入權(quán)限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--申請(qǐng)SD卡創(chuàng)建與權(quán)限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 攔截號(hào)碼權(quán)限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 浠水县| 嵊泗县| 罗山县| 如东县| 丽江市| 清镇市| 乌兰察布市| 贵阳市| 龙陵县| 剑阁县| 饶平县| 贺兰县| 青龙| 泊头市| 德庆县| 时尚| 建水县| 清涧县| 嘉禾县| 灌南县| 曲水县| 蛟河市| 平凉市| 林周县| 搜索| 桃源县| 武山县| 翼城县| 远安县| 都江堰市| 庄河市| 鹤岗市| 石台县| 静安区| 嫩江县| 阿克陶县| 贵南县| 万全县| 扶余县| 神池县| 苏尼特右旗|