您好,登錄后才能下訂單哦!
這篇文章主要介紹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怎么實現音樂播放器進度條效果”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。