android實現音樂播放器(進度條)
阿新 • • 發佈:2019-02-16
|--效果圖
|--依賴3個物件
MediaPlayer:實現音樂播放,暫停,緩衝。
SeekBar:滑動的進度條。
java.util.Timer:定時器,時時更新進度條。
|--main.xml樣式檔案
[html] view plain copy print?- <spanstyle="font-size:14px;"><TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text
- <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></span><spanstyle="font-size: 24px;">
- </span>
|--Activity實現程式碼
[java] view plain copy print?- <span style="font-size:14px;">/**
- * @CreateDate 2015-2-3
- * @Author hubiao
- * @Title 音樂播放器
- */
- publicclass MediaActivity extends Activity {
- private MediaPlayer mediaPlayer;//媒體播放器
- private Button playButton;
- private Button replayButton ;
- privateboolean isCellPlay;/*在結束通話電話的時候,用於判斷是否為是來電時中斷*/
- privateboolean isSeekBarChanging;//互斥變數,防止進度條與定時器衝突。
- privateint currentPosition;//當前音樂播放的進度
- private SeekBar seekBar;
- private Timer timer;
- privatestaticfinal String TAG = "MediaActivity";
- @Override
- publicvoid 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() {
- publicvoid onClick(View v) {
- mediaPlayer.reset();
- currentPosition = 0;
- play();
- }
- });
- //監聽來電事件
- TelephonyManager phoneyMana = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
- phoneyMana.listen(new myPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);
- }
- /*銷燬時釋資源*/
- @Override
- protectedvoid onDestroy() {
- mediaPlayer.release();
- timer.cancel();
- timer = null;
- mediaPlayer = null;
- super.onDestroy();
- }
- /*播放或暫停事件處理*/
- privateclass PalyListener implements OnClickListener {
- publicvoid onClick(View v) {
- if(playButton.getText().toString().equals("播放"))
- {
- currentPosition = mediaPlayer.getCurrentPosition();//記錄播放的位置
- mediaPlayer.stop();//暫停狀態
- playButton.setText(R.string.stop);
- timer.purge();//移除所有任務;
- }
- else{
- mediaPlayer.reset();
- play();
- }
- }
- }
- /*播放處理*/
- privatevoid 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() {
- publicvoid 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
- publicvoid 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();
- }
- }
- /*來電事件處理*/
- privateclass myPhoneStateListener extends PhoneStateListener
- {
- @Override
- publicvoid 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;
- }
- }
- }
- /*進度條處理*/
- publicclass MySeekBar implements OnSeekBarChangeListener{
- publicvoid onProgressChanged(SeekBar seekBar, int progress,
- boolean fromUser) {
- }
- /*滾動時,應當暫停後臺定時器*/
- publicvoid onStartTrackingTouch(SeekBar seekBar) {
- isSeekBarChanging = true;
- }
- /*滑動結束後,重新設定值*/
- publicvoid onStopTrackingTouch(SeekBar seekBar) {
- isSeekBarChanging = false;
- mediaPlayer.seekTo(seekBar.getProgress());
- }
- }
- }</span>
|--補充 1:如果mp3在sd中,如播放失敗,是否申請sd訪問許可權或mp3檔案是否存在。 2:MediaPlayer對有個別的音訊好像不太支援,如果路徑正確,許可權具備還無法播放,就考慮下音訊問題。 3:本案例用到的許可權。 [html] view plain copy print?
- <!-- 申請SD卡寫入許可權 -->
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <!--申請SD卡建立與許可權 -->
- <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <!-- 攔截號碼許可權 -->
- <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>