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

依賴3個對象
MediaPlayer:實現(xiàn)音樂播放,暫停,緩沖。
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實現(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;/*在掛斷電話的時候,用于判斷是否為是來電時中斷*/
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();
//監(jiān)聽滾動條事件
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);
}
/*銷毀時釋資源*/
@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();//移除所有任務;
}
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數(shù)據源
mediaPlayer.prepareAsync();//數(shù)據緩沖
/*監(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ù)
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://無電話狀態(tài)
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卡創(chuàng)建與權限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 攔截號碼權限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android之自定義實現(xiàn)BaseAdapter(通用適配器三)
這篇文章主要為大家詳細介紹了Android之自定義實現(xiàn)BaseAdapter通用適配器第三篇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12
Android編程實現(xiàn)使用Intent傳輸包含自定義類的ArrayList示例
這篇文章主要介紹了Android編程實現(xiàn)使用Intent傳輸包含自定義類的ArrayList,涉及Android對象序列化、反序列化、Intent數(shù)據傳輸?shù)认嚓P操作技巧,需要的朋友可以參考下2017-08-08
android ScrollView實現(xiàn)水平滑動回彈
這篇文章主要為大家詳細介紹了android ScrollView實現(xiàn)水平滑動回彈,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
Android ListView實現(xiàn)圖文列表顯示
這篇文章主要為大家詳細介紹了Android ListView實現(xiàn)圖文列表顯示,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
Android使用GPS獲取用戶地理位置并監(jiān)聽位置變化的方法
這篇文章主要介紹了Android使用GPS獲取用戶地理位置并監(jiān)聽位置變化的方法,實例分析了Android編程中GPS定位的實現(xiàn)與使用技巧,需要的朋友可以參考下2015-12-12
Android開發(fā)數(shù)據結構算法ArrayList源碼詳解
這篇文章主要為大家介紹了Android開發(fā)數(shù)據結構算法ArrayList源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10

