一、录制视频
视频录制的动作为MediaStore.ACTION_VIDEO_CAPTURE。在调用录制视频界面的Intent中必须设置存放视频的文件,放在intent的Extra部分,通过关键字MediaStore.EXTRA_OUTPUT设置文件的Uri。Uri需要根据SDK版本分“file://”和FileProvider两种情况。另外,还需要授予写文件的权限。
下面是打开视频录制界面的具体代码:
File path = new File(getExternalFilesDir(null),"test/"); // 值为Android/data/<package-name>/files/test/
if(!path.exists())path.mkdirs()); // 创建目录
videoFile = new File(path, "video.3gp"); // 目标文件
if(Build.VERSION.SDK_INT>=24){
fileProviderAuthority = getPackageName() + ".fileProvider";
// 格式为:content://com.zzk.a1501systemactivity.fileProvider/testdir/video.3gp,
// testdir是res/file_paths/file_paths.xml中定义的目录别名
videoUri = FileProvider.getUriForFile(MainActivity.this, fileProviderAuthority, videoFile);
} else { // Android 7 以前可以直接在intent中向其他应用分享文件
videoUri = Uri.fromFile(videoFile);
}
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); // 录视频动作
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // 视频质量:0表示低,1表示高
if(videoFile.exists()) videoFile.delete(); // 若视频文件已存在,需先删除
intent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri); // 录制的视频保存到videoUri指定的文件
intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // 授予对方写该文件的权限
startActivityForResult(intent, RECORD_VIDEO); // 调用录视频应用
打开的视频录制界面是这样的:
录制完成后会调用主活动的onActivityResult方法,在该方法中对新录制的视频进行处理。录制到的视频文件是调用前设置好的,所以一般不需再处理。在应用中一般会为视频生成缩略图,并显示到界面上。具体代码如下:
Uri uri = Uri.fromFile(videoFile);
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videoFile.getPath(),
MediaStore.Video.Thumbnails.MINI_KIND); // 生成视频缩略图
photoView.setImageBitmap(bitmap); // 显示到界面
二、选择视频
选择视频采用通用的文档选择动作Intent.ACTION_GET_CONTENT,只选择视频文件需将类型设置为video/*。返回的Intent中有选中视频的Uri,但该Uri有两种格式需要分别处理:
1)Android4.4及更高版本返回文档类型的uri,格式为:
content://com.android.providers.media.documents/document/video:202026
处理时需要先把最后的视频id取出来,上面的例子中为202026;再根据id查询MediaStore获得视频文件的存放路径等信息。
2)低于Android4.4的版本返回视频在MediaStore中的uri,格式为:
content://media/external/video/media/202026
处理时直接用这个uri去查询MediaStore即可获得视频文件的存放路径等信息。
有了视频文件的存放路径,就可以再根据需要进一步处理,比如播放视频或将文件复制到应用的目录下。
下面是打开视频选择界面的具体代码:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // 选择文件动作
intent.setType("video/*"); // 要选择的文件类型为视频
startActivityForResult(intent, PICK_VIDEO); // 启动文件选择应用
打开的视频选择界面是这样的:
用户选择一个视频并返回后,回调onActivityResult方法,Intent中有选中视频的Uri,需要注意返回的视频Uri分两种格式分别处理。例如,下面的代码将选中的视频文件复制到需要的目录,然后生成缩略图显示到界面上。
Uri uri = data.getData(); // 得到选中的视频文件的uri
String filePath = null; // 以下代码从uri中获取视频文件的路径
if(DocumentsContract.isDocumentUri(this, uri)){ // Android4.4 及以上版本的uri格式
String docId = DocumentsContract.getDocumentId(uri); // docId格式为:video:610429
String id = docId.split(":")[1]; // 获得文件id,即:后的部分,上例中为610429
// 根据文件id查询MediaStore
Cursor cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null,
MediaStore.Video.Media._ID+"="+id, null, null);
// 从查询结果中获得文件路径
if(cursor!=null) {
if(cursor.moveToFirst()){
int columnId = cursor.getColumnIndex(MediaStore.Video.Media.DATA);
filePath = cursor.getString(columnId);
}
cursor.close();
}
} else { // Android 4.4 之前版本的uri格式
filePath = uri.getPath();
}
if(filePath!=null) { // 将选中的文件拷贝到videoFile,生成缩略图,并显示到界面
FileUtil.copyFile(new File(filePath), videoFile);
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videoFile.getPath(), MediaStore.Video.Thumbnails.MINI_KIND);
photoView.setImageBitmap(bitmap);
}
三、播放视频
播放视频采用通用的文件查看动作Intent.ACTION_VIEW,将类型设置为video/*,并将要播放的音频文件以uri格式放入Data中。以Android 7版本为分界,Uri格式分为“file://”格式和FileProvider格式两种。具体代码如下:
File path = new File(getExternalFilesDir(null),"test/"); // 值为Android/data/<package-name>/files/test/
videoFile = new File(path, "video.3gp"); // 目标文件
if(Build.VERSION.SDK_INT>=24){
fileProviderAuthority = getPackageName() + ".fileProvider";
// 格式为:content://com.zzk.a1501systemactivity.fileProvider/testdir/video.3gp,
// testdir是res/file_paths/file_paths.xml中定义的目录别名
videoUri = FileProvider.getUriForFile(MainActivity.this, fileProviderAuthority, videoFile);
} else { // Android 7 以前可以直接在intent中向其他应用分享文件
videoUri = Uri.fromFile(videoFile);
}
Intent intent = new Intent(Intent.ACTION_VIEW); // 查看文件动作
intent.setDataAndType(videoUri, "video/*"); // 要查看的视频由videoUri指定,类型为视频
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 授予对方读取该文件的权限
startActivity(intent); // 调用视频播放应用
调用后,如果系统中有多个可以播放视频的应用,则会弹出一个选择界面。选择其中一个应用(比如“小米视频”)后,就会用该应用播放视频。
完整代码下载: