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 七种进度条的样式
  • Android中实现Webview顶部带进度条的方法
  • android自定义进度条渐变色View的实例代码
  • Android文件下载进度条的实现代码
  • android ListView和ProgressBar(进度条控件)的使用方法
  • Android中自定义进度条详解
  • 实例详解Android自定义ProgressDialog进度条对话框的实现
  • Android编程之ProgressBar圆形进度条颜色设置方法
  • Android三种方式实现ProgressBar自定义圆形进度条
  • Android ProgressBar进度条使用详解
(0)

相关推荐

  • android自定义进度条渐变色View的实例代码

    最近在公司,项目不是很忙了,偶尔看见一个兄台在CSDN求助,帮忙要一个自定义的渐变色进度条,我当时看了一下进度条,感觉挺漂亮的,就尝试的去自定义view实现了一个,废话不说,先上图吧! 这个自定义的view,完全脱离了android自带的ProgressView,并且没使用一张图片,这样就能更好的降低程序代码上的耦合性! 下面我贴出代码  ,大概讲解一下实现思路吧! 复制代码 代码如下: package com.spring.progressview; import android.conten

  • Android三种方式实现ProgressBar自定义圆形进度条

    进度条样式在项目中经常可以见到,下面小编给大家分享Android三种方式实现ProgressBar自定义圆形进度条. Android进度条有4种风格可以使用. 默认值是progressBarStyle. 设置成progressBarStyleSmall后,图标变小. 设置成progressBarStyleLarge后,图标变大 设置成progressBarStyleHorizontal后,变成横向长方形. 自定义圆形进度条ProgressBar的一般有三种方式: 一.通过动画实现 定义res/a

  • android ListView和ProgressBar(进度条控件)的使用方法

    ListView控件的使用:ListView控件里面装的是一行一行的数据,一行中可能有多列,选中一行,则该行的几列都被选中,同时可以触发一个事件,这种控件在平时还是用得很多的.使用ListView时主要是要设置一个适配器,适配器主要是用来放置一些数据.使用起来稍微有些复杂,这里用的是android自带的SimpleAdapter,形式如下:android.widget.SimpleAdapter.SimpleAdapter(Context context, List<? extends Map<

  • Android中自定义进度条详解

    Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子 很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如: ok,我们开始吧: 一)变换前背景 先来看看progressbar的属性: 复制代码 代码如下: <ProgressBar             android:id="@+id/progressBar"             style="?android:attr/progressBarStyleHor

  • Android 七种进度条的样式

    当一个应用在后台执行时,前台界面就不会有什么信息,这时用户根本不知道程序是否在执行.执行进度如何.应用程序是否遇到错误终止等,这时需要使用进度条来提示用户后台程序执行的进度.Android系统提供了两大类进度条样式,长形进度条(progress-BarStyleHorizontal) 和圆形进度条(progressBarStyleLarge).进度条用处很多,比如,应用程序装载资源和网络连接时,可以提示用户稍等,这一类进度条只是代表应用程序中某一部分的执行情况,而整个应用程序执行情况呢,则可以通

  • 实例详解Android自定义ProgressDialog进度条对话框的实现

    Android SDK已经提供有进度条组件ProgressDialog组件,但用的时候我们会发现可能风格与我们应用的整体风格不太搭配,而且ProgressDialog的可定制行也不太强,这时就需要我们自定义实现一个ProgressDialog. 通过看源码我们发现,ProgressDialog继承自Alertdialog,有一个ProgressBar和两个TextView组成的,通过对ProgressDialog的源码进行改进就可以实现一个自定义的ProgressDialog. 1.效果: 首先

  • Android编程之ProgressBar圆形进度条颜色设置方法

    本文实例讲述了Android ProgressBar圆形进度条颜色设置方法.分享给大家供大家参考,具体如下: 你是不是还在为设置进度条的颜色而烦恼呢--别着急,且看如下如何解决. ProgressBar分圆形进度条和水平进度条 我这里就分享下如何设置圆形进度条的颜色吧,希望对大家会有帮助. 源码如下: 布局文件代码: <ProgressBar android:id="@+id/progressbar" android:layout_width="wrap_content

  • Android ProgressBar进度条使用详解

    ProgressBar进度条,分为旋转进度条和水平进度条,进度条的样式根据需要自定义,之前一直不明白进度条如何在实际项目中使用,网上演示进度条的案例大多都是通过Button点击增加.减少进度值,使用方法incrementProgressBy(int),最简单的做法是在xml布局文件中放置ProgressBar空间,然后再MainActivity中触发事件后执行incrementProgressBy(int),代码如下: <LinearLayout xmlns:android="http:/

  • Android中实现Webview顶部带进度条的方法

    写这篇文章,做份备忘,简单滴展示一个带进度条的Webview示例,进度条位于Webview上面. 示例图如下: 主Activity代码: 复制代码 代码如下: package com.droidyue.demo.webviewprogressbar; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.vi

  • Android文件下载进度条的实现代码

    main.xml: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_paren

随机推荐