中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android怎么實現音樂播放器進度條效果

發布時間:2021-04-17 10:55:16 來源:億速云 閱讀:1310 作者:小新 欄目:移動開發

這篇文章主要介紹android怎么實現音樂播放器進度條效果,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

具體內容如下

效果圖

android怎么實現音樂播放器進度條效果

依賴3個對象

MediaPlayer:實現音樂播放,暫停,緩沖。

SeekBar:滑動的進度條。

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

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實現代碼

/** 
 * @CreateDate 2015-2-3 
 * @Author hubiao 
 * @Title 音樂播放器 
 */ 
public class MediaActivity extends Activity { 
 private MediaPlayer mediaPlayer;//媒體播放器 
 private Button playButton; 
 private Button replayButton ; 
 private boolean isCellPlay;/*在掛斷電話的時候,用于判斷是否為是來電時中斷*/ 
 private boolean isSeekBarChanging;//互斥變量,防止進度條與定時器沖突。 
 private int currentPosition;//當前音樂播放的進度 
 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); 
 
 //實例化媒體播放器 
 mediaPlayer = new MediaPlayer(); 
 
 //監聽滾動條事件 
 seekBar = (SeekBar) findViewById(R.id.playSeekBar); 
 seekBar.setOnSeekBarChangeListener(new MySeekBar()); 
 
 // 監聽[播放或暫停]事件 
 playButton= (Button) findViewById(R.id.playButton); 
 playButton.setOnClickListener(new PalyListener()); 
 
 //監聽[重播]事件 
 replayButton= (Button) findViewById(R.id.replayButton); 
 replayButton.setOnClickListener(new OnClickListener() { 
 public void onClick(View v) { 
 mediaPlayer.reset(); 
 currentPosition = 0; 
 play(); 
 } 
 }); 
 
 //監聽來電事件 
 TelephonyManager phoneyMana = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
 phoneyMana.listen(new myPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE); 
 } 
 /*銷毀時釋資源*/ 
 @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();//暫停狀態 
 playButton.setText(R.string.stop); 
 timer.purge();//移除所有任務; 
 } 
 else{ 
 mediaPlayer.reset(); 
 play(); 
 } 
 } 
 } 
 
 /*播放處理*/ 
 private void play() { 
 File media = new File("/mnt/sdcard/files/","bewithyou.mp3");//由于是練習,就把mp3名稱固定了 
 Log.i(TAG, media.getAbsolutePath()); 
 if(media.exists()) 
 { 
 try { 
 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//設置音頻類型 
 mediaPlayer.setDataSource(media.getAbsolutePath());//設置mp3數據源 
 mediaPlayer.prepareAsync();//數據緩沖 
 /*監聽緩存 事件,在緩沖完畢后,開始播放*/ 
 mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
  public void onPrepared(MediaPlayer mp) { 
  mp.start(); 
  mp.seekTo(currentPosition); 
  playButton.setText(R.string.play); 
  seekBar.setMax(mediaPlayer.getDuration()); 
  } 
 }); 
 //監聽播放時回調函數 
 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(); 
 } 
 } 
 
 /*來電事件處理*/ 
 private class myPhoneStateListener extends PhoneStateListener 
 { 
 @Override 
 public void onCallStateChanged(int state, String incomingNumber) { 
 switch (state) { 
 case TelephonyManager.CALL_STATE_RINGING://來電,應當停止音樂 
 if(mediaPlayer.isPlaying() && playButton.getText().toString().equals("播放")){ 
  currentPosition = mediaPlayer.getCurrentPosition();//記錄播放的位置 
  mediaPlayer.stop(); 
  isCellPlay = true;//標記這是屬于來電時暫停的標記 
  playButton.setText(R.string.stop); 
  timer.purge();//移除定時器任務; 
 } 
 break; 
 case TelephonyManager.CALL_STATE_IDLE://無電話狀態 
 if(isCellPlay){ 
  isCellPlay = false; 
  mediaPlayer.reset(); 
  play(); 
 } 
 break; 
 } 
 } 
 } 
 
 /*進度條處理*/ 
 public class MySeekBar implements OnSeekBarChangeListener{ 
 
 public void onProgressChanged(SeekBar seekBar, int progress, 
 boolean fromUser) { 
 } 
 
 /*滾動時,應當暫停后臺定時器*/ 
 public void onStartTrackingTouch(SeekBar seekBar) { 
 isSeekBarChanging = true; 
 } 
 /*滑動結束后,重新設置值*/ 
 public void onStopTrackingTouch(SeekBar seekBar) { 
 isSeekBarChanging = false; 
 mediaPlayer.seekTo(seekBar.getProgress()); 
 } 
 } 
}

補充:

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

<!-- 申請SD卡寫入權限 --> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<!--申請SD卡創建與權限 --> 
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
<!-- 攔截號碼權限 --> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

以上是“android怎么實現音樂播放器進度條效果”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长丰县| 平舆县| 旺苍县| 依兰县| 临沭县| 湛江市| 铜陵市| 阿勒泰市| 香格里拉县| 白水县| 扶绥县| 集贤县| 迁西县| 红河县| 浦东新区| 航空| 巴彦县| 来凤县| 孟村| 泾阳县| 大兴区| 普兰店市| 霍邱县| 襄樊市| 增城市| 修文县| 阿克| 桃园市| 孟连| 韶关市| 永吉县| 阿合奇县| 岑溪市| 安庆市| 元朗区| 潮安县| 咸丰县| 皋兰县| 邮箱| 赣州市| 伊宁县|