直接调用硬件摄像头录像和拍照
首先,加权限:
<!-- 摄像头权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.RECORD_VIDEO"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!--往sdcard中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--在sdcard中创建/删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera camera;
private MediaRecorder mMediaRecorder;
private View view;
开启摄像头:
private void setupViews(){
surfaceView = (SurfaceView) view.findViewById(R.id.camera_preview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(surfaceCallback);
surfaceHolder.setFixedSize(720,960); //设置分辨率 720*960
surfaceHolder.setKeepScreenOn(true);// 屏幕常亮
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //surfaceview的显示源类型
}
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();
camera.setPreviewDisplay(holder);
} catch (IOException e) {
camera.release();
camera = null;
}
if (camera != null)
{
Camera.Parameters Parameters = camera.getParameters();
Parameters= camera.getParameters();
Parameters.set("jpeg-quality", 100);
camera.setParameters(Parameters);//设置生效
camera.startPreview(); ;//开始预览
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) { 销毁时激发,一般在这里将画图的线程停止、释放。
camera.stopPreview();
camera.release();
camera = null;
}
};
开始录像:
private void getVideo(){
if (camera != null) {
mMediaRecorder = new MediaRecorder();
// Unlock the camera object before passing it to media recorder.
camera.unlock();
mMediaRecorder.setCamera(camera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //声音
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
mMediaRecorder.setVideoSize(480, 320);
mMediaRecorder.setVideoEncodingBitRate(5*1024*1024);
// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
mMediaRecorder.setVideoFrameRate(20);
mMediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String filename = dateFormat.format(date) + ".mp4"; // Used when emailing.
String filePath = "sdcard/" + filename;
File cameraDir = new File("sdcard");
cameraDir.mkdirs();
mMediaRecorder.setOutputFile(filePath);
try {
mMediaRecorder.prepare();
mMediaRecorder.start(); // Recording is now started
} catch (Exception e) {
Log.e(TAG, "Could not start media recorder. ", e);
return;
}
}
}
停止录像
private void stopVideo(){
if(mMediaRecorder==null){
Log.e(TAG, "mMediaRecorder==null");
return;
}
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
if(camera != null){
camera.lock();
camera.startPreview(); //开始预览
}
}
拍照:
private void takePicture() {
if (camera != null) {
camera.takePicture(null, null, pictureCallback);
}
}
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { //保存拍到的照片
public void onPictureTaken(byte[] data, Camera camera) {
Log.e(TAG, "data!= null");
String mPhotoPath;
File mPhotoFile;
String path=Environment.getExternalStorageDirectory().toString()+"/DCIM/Camera";
File path1 = new File(path);
if(!path1.exists()) //若不存在,创建cardImages目录
{
path1.mkdirs();
}
mPhotoPath = path+getPhotoName();
mPhotoFile = new File(mPhotoPath);
if(!mPhotoFile.exists()){
try{
mPhotoFile.createNewFile();
Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(mPhotoFile));
bm.compress(Bitmap.CompressFormat.JPEG,90,bos);
bos.flush();
bos.close();
}catch(java.io.IOException ioe){
Log.e(TAG, "createNewFile fail:"+ioe.getMessage());
return;
}
}
camera.startPreview();
}
};
@SuppressLint("SimpleDateFormat")
private String getPhotoName(){
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String photoName = dateFormat.format(date)+".jpg";
return photoName;
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.view.SurfaceView
android:id="@+id/camera_preview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"/>
</RelativeLayout>