android實(shí)現(xiàn)音樂(lè)播放器進(jìn)度條效果
本文實(shí)例為大家分享了android實(shí)現(xiàn)音樂(lè)播放器進(jìn)度條效果的具體代碼,供大家參考,具體內(nèi)容如下
效果圖
依賴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í)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器(MediaPlayer)
- Android簡(jiǎn)易音樂(lè)播放器實(shí)現(xiàn)代碼
- 教你輕松制作Android音樂(lè)播放器
- android暫?;蛲V蛊渌魳?lè)播放器的播放實(shí)現(xiàn)代碼
- Android編程開(kāi)發(fā)音樂(lè)播放器實(shí)例
- Android音樂(lè)播放器制作 掃描本地音樂(lè)顯示在手機(jī)(一)
- Android MediaPlayer實(shí)現(xiàn)音樂(lè)播放器實(shí)例代碼
- 簡(jiǎn)單實(shí)現(xiàn)Android本地音樂(lè)播放器
- Android 音樂(lè)播放器的開(kāi)發(fā)實(shí)例詳解
- Android實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器
相關(guān)文章
Android編程調(diào)用系統(tǒng)自帶的拍照功能并返回JPG文件示例【附demo源碼下載】
這篇文章主要介紹了Android編程調(diào)用系統(tǒng)自帶的拍照功能并返回JPG文件,結(jié)合實(shí)例形式分析了Android的拍照功能調(diào)用及圖形文件操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-07-07Android 實(shí)現(xiàn)微信,微博,微信朋友圈,QQ分享的功能
這篇文章主要介紹了Android 實(shí)現(xiàn)微信,微博,微信朋友圈,QQ分享的功能的相關(guān)資料,需要的朋友可以參考下2016-12-12Android?雙屏異顯自適應(yīng)Dialog的實(shí)現(xiàn)
Android 多屏互聯(lián)的時(shí)代,必然會(huì)出現(xiàn)多屏連接的問(wèn)題,本文主要介紹了Android?雙屏異顯自適應(yīng)Dialog的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12Android Studio升級(jí)到4.1以后插件問(wèn)題解決
這篇文章主要介紹了Android Studio升級(jí)到4.1以后插件問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Android使用線程獲取網(wǎng)絡(luò)圖片的方法
這篇文章主要為大家詳細(xì)介紹了Android使用線程獲取網(wǎng)絡(luò)圖片的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android畫圖之抗鋸齒paint和Canvas兩種方式實(shí)例
本篇文章主要介紹了Android畫圖之抗鋸齒paint和Canvas兩種方式實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Android視頻/音頻緩存框架AndroidVideoCache(Okhttp)詳解
這篇文章主要為大家詳細(xì)介紹了Android視頻、音頻緩存框架AndroidVideoCache,實(shí)現(xiàn)邊下邊播功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android開(kāi)發(fā)實(shí)現(xiàn)的圖片瀏覽功能示例【放大圖片】
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)的圖片瀏覽功能,結(jié)合實(shí)例形式分析了Android針對(duì)圖片的切換顯示、透明度、大小調(diào)整等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04Android使用MediaRecorder類實(shí)現(xiàn)視頻和音頻錄制功能
Android提供了MediaRecorder這一個(gè)類來(lái)實(shí)現(xiàn)視頻和音頻的錄制功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07android中Webview實(shí)現(xiàn)截屏三種方式小結(jié)
本篇文章主要介紹了android Webview實(shí)現(xiàn)截屏,主要詳解了3種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03