Android中Intent习惯用法

2019-12-10 19:42:07于丽

摄像

通过Intent启动摄像机进行摄像的步骤与上面刚提到的通过Intent启动摄像机进行拍照的步骤非常相似,稍有区别。要启动Camera进行摄像,我们需要给intent设置值为MediaStore.ACTION_VIDEO_CAPTURE的action,然后我们用key为MediaStore.EXTRA_OUTPUT的extra设置图片的输出路径,最后调用startActivityForResult()方法以启动摄像机应用,并重写我们的onActivityResult()以便在该方法中得知摄像完成。

以下是示例代码:

//表示用于录视频的requestCode
 private final int REQUEST_CODE_VIDEO_CAPTURE = 2;

 //我们存储视频的输出路径,以便后续使用
 private Uri videoOutputUri = null;

 //摄像
 private void captureVideo(){
 PackageManager pm = getPackageManager();

 //先判断本机是否在硬件上有摄像能力
 if(pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)){
 //将intent的action设置为MediaStore.ACTION_VIDEO_CAPTURE
 Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
 ComponentName componentName = intent.resolveActivity(pm);
 //判断手机上有无摄像机应用
 if(componentName != null){
 //创建视频文件,以便于通过Uri.fromFile()生成对应的Uri
 File videoFile = createVideoFile();
 if(videoFile != null){
  //根据videoFile生成对应的Uri
  videoOutputUri = Uri.fromFile(videoFile);
  //利用该Uri作为摄像完成后视频的存储路径
  intent.putExtra(MediaStore.EXTRA_OUTPUT, videoOutputUri);
  //调用startActivityForResult()方法,以便在onActivityResult()方法中进行相应处理
  startActivityForResult(intent, REQUEST_CODE_VIDEO_CAPTURE);
 }else{
  Toast.makeText(this, "无法创建视频文件!", Toast.LENGTH_LONG).show();
 }
 }else{
 Toast.makeText(this, "未在本机找到Camera应用,无法摄像!", Toast.LENGTH_LONG).show();
 }
 }else{
 Toast.makeText(this, "本机没有摄像头,无法摄像!", Toast.LENGTH_LONG).show();
 }
 }

 //创建视频文件,以便于通过Uri.fromFile()生成对应的Uri
 private File createVideoFile(){
 File videoFile = null;

 //用时间戳拼接文件名称,防止文件重名
 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
 String imageFileName = "MP4" + timeStamp + "_";
 File storageDir = getExternalFilesDir(Environment.DIRECTORY_MOVIES);

 try{
 videoFile = File.createTempFile(
  imageFileName, //前缀
  ".mp4", //后缀
  storageDir //文件夹
 );
 }catch (IOException e){
 videoFile = null;
 e.printStackTrace();
 Log.e("DemoLog", e.getMessage());
 }

 return videoFile;
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
 //首先判断是否正确完成
 if(resultCode == RESULT_OK){
 switch (requestCode){
 case REQUEST_CODE_VIDEO_CAPTURE:
  //如果设置MediaStore.EXTRA_OUTPUT作为extra的时候,
  //在有的手机上,此处的intent为不为null,但是在有的手机上却为null,
  //所以不建议从intent.getData()中获取视频路径
  //我们应该自己记录videoOutputUri来得知视频路径,下面注释的代码不建议使用
  /*if(intent != null){
  Uri videoUri = intent.getData();
  if(videoUri != null){
  //路径格式如content://media/external/video/media/130025
  Log.i("DemoLog", "视频路径是: " + videoUri.toString());
  }
  }*/

  String videoPath = videoOutputUri.toString();
  //1.如果没有设置MediaStore.EXTRA_OUTPUT作为视频文件存储路径,那么路径格式如下所示:
  // 路径格式如content://media/external/video/media/130025
  //2.如果设置了MediaStore.EXTRA_OUTPUT作为视频文件存储路径,那么路径格式如下所示:
  // 路径格式如file:///storage/sdcard0/Android/data/com.ispring.commonintents/files/Movies/MP420150919_184132_533002075.mp4
  Log.i("DemoLog", "视频路径是: " + videoPath);
  Toast.makeText(this, "视频路径是: " + videoPath, Toast.LENGTH_LONG).show();
  break;
 default:
  break;
 }
 }
 }