Android开发实现的简单媒体播放器功能示例

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

本文实例讲述了Android开发实现的简单媒体播放器功能。分享给大家供大家参考,具体如下:

一、概述:

因为播放视频需要很大的内存,所以必须使用surfaceview ,

surfaceview 里实现了双缓冲的功能,

二、全部代码:

/**
 * @描述     使用surfaceview 创建视频
 * @项目名称   App_Basic
 * @包名     com.example.basic.media
 * @类名     MediaPlayerActivity
 * @author   chenlin
 * @date    2013-3-25 上午7:36:32
 * @version   1.0
 */
public class MediaPlayerActivity extends BaseActivity {
  private MediaPlayer mPlayer;
  private Button mBtnPlay;
  private Button mBtnPause;
  private SurfaceView mSurfaceView;
  private int mCurrentPosition;
  private SeekBar seekBar;
  private boolean isPlaying;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSurfaceView = new SurfaceView(this);
    seekBar = new SeekBar(this);
    seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
      @Override
      public void onStopTrackingTouch(SeekBar seekBar) {
        int progress = seekBar.getProgress();
        if (mPlayer != null && isPlaying) {
          mPlayer.seekTo(progress);
        }
      }
      @Override
      public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
      }
      @Override
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        // TODO Auto-generated method stub
      }
    });
    mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    mSurfaceView.getHolder().addCallback(new Callback() {
      @Override
      public void surfaceDestroyed(SurfaceHolder holder) {
        if (mPlayer!= null && mPlayer.isPlaying()) {
          mCurrentPosition = mPlayer.getCurrentPosition();
          stop();
        }
      }
      @Override
      public void surfaceCreated(SurfaceHolder holder) {
        if (mCurrentPosition > 0) {
          play(mCurrentPosition);
        }
      }
      @Override
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
      }
    });
  }
  public void play(final int currentPosition){
    try {
      mPlayer = new MediaPlayer();
      mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
      Uri myUri = Uri.fromFile(new File("sdcard/mp3/1.mp3"));
      mPlayer.setDataSource(getApplicationContext(), myUri);
      mPlayer.setLooping(true);
      mPlayer.setDisplay(mSurfaceView.getHolder());
      mPlayer.prepareAsync();
      //mPlayer.prepare();
      mBtnPlay.setEnabled(false);
      mPlayer.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
          mBtnPlay.setEnabled(true);
          mPlayer.release();
        }
      });
      mPlayer.setOnErrorListener(new OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
          mBtnPlay.setEnabled(true);
          mPlayer.release();
          isPlaying = false;
          return false;
        }
      });
      mPlayer.setOnPreparedListener(new OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
          mPlayer.start();
          mPlayer.seekTo(currentPosition);
          seekBar.setMax(mPlayer.getDuration());
          new Thread(new Runnable() {
            @Override
            public void run() {
              isPlaying = true;
              while(isPlaying){
                seekBar.setProgress(mPlayer.getCurrentPosition());
                SystemClock.sleep(500);
              }
            }
          });
        }
      });
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public void pause(){
    if ("接续".equals(mBtnPause.getText().toString())) {
      mBtnPause.setText("暂停");
      mPlayer.start();
      return;
    }
    if (mPlayer != null && mPlayer.isPlaying()) {
      mPlayer.pause();
      mBtnPause.setText("继续");
      return;
    }
  }
  public void reset(){
    if (mPlayer != null && mPlayer.isPlaying()) {
      mPlayer.seekTo(0);
      return;
    }
    play(0);
  }
  public void stop(){
    if (mPlayer != null && mPlayer.isPlaying()) {
      mPlayer.stop();
      mPlayer.release();
      mPlayer = null;
      mBtnPlay.setEnabled(true);
      isPlaying = false;
    }
  }
}

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android文件操作技巧汇总》、《Android资源操作技巧汇总》及《Android控件用法总结

希望本文所述对大家Android程序设计有所帮助。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多