第一部分:MediaPlayer的其他创建方法
MediaPlayer有灵活的应用,除了默认的无参构造方法之外,还有以下三种创建方法,见下图所示(双击图片可以放大):
显然,3个要素:
1) 上下文
2) 资源(URI---Path可转为Uri或者资源id)
3) SurfaceHolder----视频播放会用到,用于播放界面的控制
示例代码如下:
- MediaPlayer mMediaPlayer = MediaPlayer.create(this, R.raw.vedio1);
- mMediaPlayer.start();//此构造方法下,不需要parpared
第二部分:MediaPlayer资源的设置:setDataSource()方法的使用
当不能通过资源ID或者URL访问媒体内容时,需要使用MediaPlayer默认构造方法,调用setDataSource()方法。
A:path
可以通过硬编码指定path
代码如下:
- //1:path
- MediaPlayer mMediaPlayer = new MediaPlayer();
- String path= "/mnt/sdcard/vedio1";//对应assets文件夹的路径也类似
- mMediaPlayer.setDataSource(path);
B: AssetFileDescriptor
注:出于安全原因,媒体播放器不能访问应用程序的/data目录,但应用程序可以开开文件,然后将(打开)的FileDescriptor传递给setDataSource()。
App的/data/data/com.mike.mediaplayer/ 的文件结构如下图所示,(双击图片可放大):
也可通过以下方法获得其路径,代码如下:
- File filesDir = this.getFilesDir();
- File cacheDir = this.getCacheDir();
- Log.d("index", "ficacheDir is :" + cacheDir.getPath());
- Log.d("index", "fileDir is :" + filesDir.getPath());
FileDescriptor的应用代码如下:
- // 2,AssetFileDescriptor
- AssetFileDescriptor fileDescriptor = getResources()//用法:出于安全原因,媒体播放器不能访问应用程序的/data目录,
- .openRawResourceFd(R.raw.vedio1);//但应用程序可以开开文件,然后将(打开)的FileDescriptor传递给setDataSource()
- if (null != fileDescriptor) {
- MediaPlayer mMediaPlayer = new MediaPlayer();
- mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),
- fileDescriptor.getStartOffset(),
- fileDescriptor.getLength());//可以通过起始位置和结束位置来控制播放的长短
- fileDescriptor.close();//一定要关闭
- mMediaPlayer.prepare();
- mMediaPlayer.start();
- }
C:path和uri可以相互转换,代码如下:
- //3,path 和 uri的转换
- MediaPlayer mMediaPlayer = new MediaPlayer();
- mMediaPlayer.setDataSource(this, Uri.parse("file://" + "/mnt/sdcard/vedio1.mp4"));
转载于:https://blog.51cto.com/mikewang/851274