Android多媒体功能开发(5)——调用系统Activity录制、选择、播放视频

一、录制视频

视频录制的动作为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);  //  调用视频播放应用

调用后,如果系统中有多个可以播放视频的应用,则会弹出一个选择界面。选择其中一个应用(比如“小米视频”)后,就会用该应用播放视频。

完整代码下载:

Android多媒体功能开发-调用系统Activity的例子

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanoage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值