
本文实例为大家分享了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()); } } },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 七种进度条的样式Android中实现Webview顶部带进度条的方法android自定义进度条渐变色View的实例代码Android文件下载进度条的实现代码android ListView和ProgressBar(进度条控件)的使用方法Android中自定义进度条详解实例详解Android自定义ProgressDialog进度条对话框的实现Android编程之ProgressBar圆形进度条颜色设置方法Android三种方式实现ProgressBar自定义圆形进度条Android ProgressBar进度条使用详解 总结以上是内存溢出为你收集整理的android实现音乐播放器进度条效果全部内容,希望文章能够帮你解决android实现音乐播放器进度条效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)