Camera开重点内容发准备工作:
1.权限
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.预览视图
2.1 SurfaceView的设置
SurfaceView surfaceView ;//获取一个SurfaceView实例,可以在布局中声明
surfaceView.getHolder().setKeepScreenOn(true);// 屏幕常亮
surfaceView.getHolder().setFixedSize(640, 640);//设置分辨率
surfaceView.getHolder().addCallback(new SurfaceCallback());//添加一个回调函数 <**重点**>
2.2 SurfaceView(回调函数)和Camera的绑定
private class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); // 打开摄像头
mCamera.setPreviewDisplay(holder); // 设置预览的试图对象
//根据屏幕方向 调整 相机方向(横屏时一切正常,竖屏需要调整,旋转90°)
mAdjustDegree = adjustDegree(MainActivity.this);
mCamera.setDisplayOrientation(mAdjustDegree);
mCamera.startPreview(); // 开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
// 拍照状态变化时(以及页面刚显示的时候)调用该方法
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
parameters = mCamera.getParameters(); // 获取各项参数
parameters.setPictureFormat(ImageFormat.JPEG); // 设置图片格式
parameters.setPreviewSize(width, height); // 设置预览大小
parameters.setPreviewFpsRange(4, 6); //设置每秒显示帧
parameters.setPictureSize(width, height); // 设置保存的图片尺寸
parameters.setJpegQuality(100); // 设置照片质量
mCamera.setParameters(parameters);
}
// 停止拍照时调用该方法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release(); // 释放照相机
mCamera = null;
}
}
}
3 拍照并存储照片
3.1 拍照函数
mCamera.takePicture(null, null, new MyPictureCallback());//第一个参数,快门完成回调,可以做一些声音播放等处理工作,最后一个拍照完成回调,回调函数中包含一个Byte数据,可以使用数据读取到文件中完成存储
3.2 拍照结果
private class MyPictureCallback implements Camera.PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
saveToSDCard(data); // 保存图片到sd卡中
camera.startPreview(); // 拍完照后,重新开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
}
extra:保存照片的方法给出
private void saveToSDCard(byte[] data) throws IOException {
//使用当前时间作为保存图片的名字
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化时间
filename = format.format(date) + ".jpg";
File dir = new File(Environment.getExternalStorageDirectory()
+ "/pic/");
if (!dir.exists()) {
dir.mkdir();
}
file = new File(dir, filename);
if (!file.exists()) {
file.createNewFile();
}
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Matrix matrix = new Matrix();
matrix.setRotate(180 - mAdjustDegree);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
FileOutputStream fos = new FileOutputStream(file.getPath());
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
}