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

所属分类: 软件编程 / Android 阅读数: 41
收藏 0 赞 0 分享

本文实例为大家分享了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异常 java.lang.IllegalStateException解决方法

这篇文章主要介绍了Android异常 java.lang.IllegalStateException解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Split()字符串分割特殊用法案例详解

本文通过案例的形式给大家详细介绍了android中split()字符串分割特殊用法的知识,非常不错具有参考借鉴价值,感兴趣的朋友参考下
收藏 0 赞 0 分享

Android仿新浪微博启动界面或登陆界面(1)

这篇文章主要为大家详细介绍了Android仿新浪微博启动界面或登陆界面的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android仿新浪微博oauth2.0授权界面实现代码(2)

这篇文章主要为大家详细介绍了Android仿新浪微博oauth2.0授权界面实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android开发中使用sqlite实现新闻收藏和取消收藏的功能

本篇文章主要介绍了sqlite实现新闻收藏和取消收藏功能,主要涉及到oracle数据库方面的内容,对于Android开发sqlite实现收藏和取消功能感兴趣的朋友可以参考下本文
收藏 0 赞 0 分享

Android仿新浪微博分页管理界面(3)

这篇文章主要为大家详细介绍了Android仿新浪微博分页管理界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android UI自定义ListView实现下拉刷新和加载更多效果

这篇文章主要介绍了Android UI自定义ListView实现下拉刷新和加载更多效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android—基于微信开放平台v3SDK开发(微信支付填坑)

这篇文章主要介绍了Android—基于微信开放平台v3SDK开发(微信支付填坑),具有一定的参考价值,有需要的可以了解一下。
收藏 0 赞 0 分享

Android仿新浪微博自定义ListView下拉刷新(4)

这篇文章主要为大家详细介绍了Android仿新浪微博自定义ListView下拉刷新,重点介绍了Adapter的详细代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android控件之使用ListView实现时间轴效果

这篇文章主要介绍了Android基础控件之使用ListView实现时间轴效果的相关资料,本文是以查看物流信息为例,给大家介绍了listview时间轴的实现代码,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多