摄像
通过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;
}
}
}










