Camera、录制视频
概述
Android框架架包含了各种相机和相机功能的支持,使你可以在你的应用中捕获图像和视频。
在我们的应用能使用设备上的相机之前,先想一想应用将来会如何使用此硬件:
(1) Camera必须——相机是必须的,你不希望你的应用安装到一个没有相机的设备上你应该在manifest文件中声明需要相机
(2)快速图像或自定义特性——你的应用将如何使用相机?你仅仅是抓取一个快速图片或视频剪辑,还是提供一个新的使用方式?
(3)存储——你的应用产生的图像和视频要给自己看还是共享给其它应用?你想在你的应用被删除后所创建的图像和视频仍然存在吗?
Android框架支持通过Camera API或Camera intent来抓取图像和视频:
.
- Camera此类是控制设备相机的主要API,此类用于在创建相机应用时获取图片和视频。
- SurfaceView此类为用户提供camera的实时图像预览。
- MediaRecorder此类用于从camera录制视频。
- Intent一个MediaStore ACTION IMAGE CAPTURE或MediaStore.ACTION VIDEO _CAPTURE的intent,可以使用它来抓取
图像或视频,而不用操作Camera对象。
清单文件中的声明
调用相机设备的权限
<uses-permission android:name="android.permission.CAMERA"/>
声明相机特性,如果你的应用使用相机或相机的一些特性,但又不是必须的设置android:required=“false”(已过时)
<uses-feature android:name="android.hardware.Camera" android:required="false"/>
保存图片
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
录制视频的权限
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
使用现有的相机应用
private static final int MEDIA_TYPE_IMAGE=1;
private static final int MEDIA_TYPE_VIDEO=2;
//拍照
public void imageCapture(View view){
Intent intent=new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,getOutputMediaFileUri(MEDIA_TYPE_IMAGE));
startActivityForResult(intent,MEDIA_TYPE_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case RESULT_OK:
if (MEDIA_TYPE_IMAGE==requestCode){
// Uri uri=data.getData();
System.out.println(file);
}else if (MEDIA_TYPE_VIDEO==requestCode){
}
break;
}
}
File file=null;
private Uri getOutputMediaFileUri(int type){
file=getOutputMediaFile(type);
return Uri.fromFile(file);
}
private File getOutputMediaFile(int type){
File file=null;
String rootPath=null;
switch (type){
case MEDIA_TYPE_IMAGE:
rootPath= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath();
file=new File(rootPath+File.separator+System.currentTimeMillis()+".jpg");
break;
case MEDIA_TYPE_VIDEO:
rootPath=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getPath();
file=new File(rootPath+File.separator+System.currentTimeMillis()+".mp4");
break;
}
return file;
}
视频获取intent
使用相机intent获取视频是使用最少代码使得你的应用获取视频的捷径。
一个视频获取intent可以包含以下额外信息:
(1) MediaStore.EXTRA_OUTPUT——此设置需要一个保存视频的路径和文件名的Uri。此设置是可选的但强烈推荐,如果你不指定此值,相机应用就杷请求到的图像以默认的文件名保存到默认的文件夹下,这些信息保存在返回的intent的Intent.getData()字段中。
(2) MediaStore.EXTRA_ VIDEO_QUALITY——此值在最低质量最小文件R寸时是0,在最高质量最大文件尺寸时是1。
(3) MediaStore. EXTRA_ DURATION_LIMIT——此值设置获取视频的长度,以秒为单位。
(4) MediaStore.EXTRA_SIZE_ LIMIT——此值设置获取视频文件的大小,以字节为单位。
//录像
public void videoCapture(View view){
Intent intent=new Intent();
intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,getOutputMediaFileUri(MEDIA_TYPE_VIDEO));
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);
startActivityForResult(intent,MEDIA_TYPE_VIDEO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case RESULT_OK:
if (MEDIA_TYPE_IMAGE==requestCode){
// Uri uri=data.getData();
System.out.println(file);
}else if (MEDIA_TYPE_VIDEO==requestCode){
System.out.println(file);
System.out.println(data.getData());
}
break;
}
}