android实现音乐播放器进度条效果

本文实例为大家分享了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实现音乐播放器进度条效果 的全部内容, 来源链接: utcz.com/z/360488.html

回到顶部