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

依賴3個(gè)對(duì)象
MediaPlayer:實(shí)現(xiàn)音樂播放,暫停,緩沖。
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 音樂播放器
*/
public class MediaActivity extends Activity {
private MediaPlayer mediaPlayer;//媒體播放器
private Button playButton;
private Button replayButton ;
private boolean isCellPlay;/*在掛斷電話的時(shí)候,用于判斷是否為是來電時(shí)中斷*/
private boolean isSeekBarChanging;//互斥變量,防止進(jìn)度條與定時(shí)器沖突。
private int currentPosition;//當(dāng)前音樂播放的進(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)聽滾動(dòng)條事件
seekBar = (SeekBar) findViewById(R.id.playSeekBar);
seekBar.setOnSeekBarChangeListener(new MySeekBar());
// 監(jiān)聽[播放或暫停]事件
playButton= (Button) findViewById(R.id.playButton);
playButton.setOnClickListener(new PalyListener());
//監(jiān)聽[重播]事件
replayButton= (Button) findViewById(R.id.replayButton);
replayButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mediaPlayer.reset();
currentPosition = 0;
play();
}
});
//監(jiān)聽來電事件
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)聽緩存 事件,在緩沖完畢后,開始播放*/
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)聽播放時(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();
}
}
/*來電事件處理*/
private class myPhoneStateListener extends PhoneStateListener
{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING://來電,應(yīng)當(dāng)停止音樂
if(mediaPlayer.isPlaying() && playButton.getText().toString().equals("播放")){
currentPosition = mediaPlayer.getCurrentPosition();//記錄播放的位置
mediaPlayer.stop();
isCellPlay = true;//標(biāo)記這是屬于來電時(shí)暫停的標(biāo)記
playButton.setText(R.string.stop);
timer.purge();//移除定時(shí)器任務(wù);
}
break;
case TelephonyManager.CALL_STATE_IDLE://無電話狀態(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訪問權(quán)限或mp3文件是否存在。
2.MediaPlayer對(duì)有個(gè)別的音頻好像不太支持,如果路徑正確,權(quá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"/>
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)簡單音樂播放器(MediaPlayer)
- Android簡易音樂播放器實(shí)現(xiàn)代碼
- 教你輕松制作Android音樂播放器
- android暫?;蛲V蛊渌魳凡シ牌鞯牟シ艑?shí)現(xiàn)代碼
- Android編程開發(fā)音樂播放器實(shí)例
- Android音樂播放器制作 掃描本地音樂顯示在手機(jī)(一)
- Android MediaPlayer實(shí)現(xiàn)音樂播放器實(shí)例代碼
- 簡單實(shí)現(xiàn)Android本地音樂播放器
- Android 音樂播放器的開發(fā)實(shí)例詳解
- Android實(shí)現(xiàn)簡單的音樂播放器
相關(guān)文章
Android之自定義實(shí)現(xiàn)BaseAdapter(通用適配器三)
這篇文章主要為大家詳細(xì)介紹了Android之自定義實(shí)現(xiàn)BaseAdapter通用適配器第三篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
Android編程實(shí)現(xiàn)使用Intent傳輸包含自定義類的ArrayList示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)使用Intent傳輸包含自定義類的ArrayList,涉及Android對(duì)象序列化、反序列化、Intent數(shù)據(jù)傳輸?shù)认嚓P(guān)操作技巧,需要的朋友可以參考下2017-08-08
android ScrollView實(shí)現(xiàn)水平滑動(dòng)回彈
這篇文章主要為大家詳細(xì)介紹了android ScrollView實(shí)現(xiàn)水平滑動(dòng)回彈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
詳解Android中Service服務(wù)的基礎(chǔ)知識(shí)及編寫方法
這篇文章主要介紹了詳解Android中Service服務(wù)的基礎(chǔ)知識(shí)及編寫方法,包括Service的啟動(dòng)流程及生命周期等基本內(nèi)容,需要的朋友可以參考下2016-04-04
Android調(diào)用系統(tǒng)圖庫獲取圖片的方法
這篇文章主要為大家詳細(xì)介紹了Android調(diào)用系統(tǒng)圖庫獲取圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
textView 添加超鏈接(兩種實(shí)現(xiàn)方式)
在textView添加超鏈接,有兩種方式,第一種通過HTML格式化你的網(wǎng)址,一種是設(shè)置autolink,讓系統(tǒng)自動(dòng)識(shí)別超鏈接,下面為大家介紹下這兩種方法的實(shí)現(xiàn)2013-06-06
Android ListView實(shí)現(xiàn)圖文列表顯示
這篇文章主要為大家詳細(xì)介紹了Android ListView實(shí)現(xiàn)圖文列表顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android使用GPS獲取用戶地理位置并監(jiān)聽位置變化的方法
這篇文章主要介紹了Android使用GPS獲取用戶地理位置并監(jiān)聽位置變化的方法,實(shí)例分析了Android編程中GPS定位的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2015-12-12
Android開發(fā)數(shù)據(jù)結(jié)構(gòu)算法ArrayList源碼詳解
這篇文章主要為大家介紹了Android開發(fā)數(shù)據(jù)結(jié)構(gòu)算法ArrayList源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10

