第一部分:MediaPlayer的其他创建方法

MediaPlayer有灵活的应用,除了默认的无参构造方法之外,还有以下三种创建方法,见下图所示(双击图片可以放大):

显然,3个要素:

1) 上下文

2) 资源(URI---Path可转为Uri或者资源id)

3) SurfaceHolder----视频播放会用到,用于播放界面的控制

示例代码如下:

 
  
  1. MediaPlayer mMediaPlayer = MediaPlayer.create(this, R.raw.vedio1); 
  2.          mMediaPlayer.start();//此构造方法下,不需要parpared 


第二部分:MediaPlayer资源的设置:setDataSource()方法的使用

当不能通过资源ID或者URL访问媒体内容时,需要使用MediaPlayer默认构造方法,调用setDataSource()方法。

A:path

可以通过硬编码指定path

代码如下:

 
  
  1. //1:path 
  2.              MediaPlayer mMediaPlayer = new MediaPlayer(); 
  3.              String path= "/mnt/sdcard/vedio1";//对应assets文件夹的路径也类似 
  4.              mMediaPlayer.setDataSource(path); 

 

B: AssetFileDescriptor

注:出于安全原因,媒体播放器不能访问应用程序的/data目录,但应用程序可以开开文件,然后将(打开)的FileDescriptor传递给setDataSource()。

App的/data/data/com.mike.mediaplayer/ 的文件结构如下图所示,(双击图片可放大):

也可通过以下方法获得其路径,代码如下:

 
  
  1. File filesDir = this.getFilesDir(); 
  2.         File cacheDir = this.getCacheDir(); 
  3.         Log.d("index""ficacheDir is :" + cacheDir.getPath()); 
  4.         Log.d("index""fileDir is :" + filesDir.getPath()); 

 

FileDescriptor的应用代码如下:

 
  
  1. // 2,AssetFileDescriptor 
  2.             AssetFileDescriptor fileDescriptor = getResources()//用法:出于安全原因,媒体播放器不能访问应用程序的/data目录, 
  3.                     .openRawResourceFd(R.raw.vedio1);//但应用程序可以开开文件,然后将(打开)的FileDescriptor传递给setDataSource() 
  4.             if (null != fileDescriptor) { 
  5.                 MediaPlayer mMediaPlayer = new MediaPlayer(); 
  6.                 mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), 
  7.                         fileDescriptor.getStartOffset(), 
  8.                         fileDescriptor.getLength());//可以通过起始位置和结束位置来控制播放的长短 
  9.                  
  10.                 fileDescriptor.close();//一定要关闭 
  11.                 mMediaPlayer.prepare(); 
  12.                 mMediaPlayer.start(); 
  13.  
  14.             } 

 

C:path和uri可以相互转换,代码如下:

 
  
  1. //3,path 和 uri的转换  
  2.              
  3.             MediaPlayer mMediaPlayer = new MediaPlayer(); 
  4.             mMediaPlayer.setDataSource(this, Uri.parse("file://" + "/mnt/sdcard/vedio1.mp4"));