一、引入:
在Android手机上进行Camera开发,可以使用两类方法:
1、借助Intent和MediaStore调用系统Camera APP程序来实现拍照或摄像。一般通用的拍照和摄像均采用此方法;
2、根据Camera API实现自定义Camera程序。这需要对Camera API有充分了解。
二、使用Intent拍摄照片:【重要】
1、Intent启动系统摄像头:
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
2、通过onActivityResult()处理程序: 也就是在onActivityResult()获取Bitmap对象。
onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
bm_camera = (Bitmap) data.getExtras().get("data");
imageView_editpic.setImageBitmap(bm_camera);
}
}
3、保存Bitmap至SD卡中:
SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddhhmmss");
String date = sDateFormat.format(new Date());
//生成照片名称
String fileName = "img_" + date + ".jpg";
//创建输出流对象
BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(new File(filePath + File.separator
+ fileName)));
//将图片保存进输出流
boolean flag = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
4、权限:
三、自定义拍照实现步骤: 【掌握】
(一)、initSurfaceView()
1、surfaceView_main初始化: findViewById()
2、初始化surfaceHolder对象: surfaceView_main.getHolder();
3、设置类型,没有这句将调用失败
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
4、添加回调
surfaceHolder.addCallback(new SurfaceHolder.Callback()) ;
1)、surfaceCreated()
开启手机摄像头
myCamera = Camera.open();
设置显示拍照预览的SurfaceHolder对象:
myCamera.setPreviewDisplay(holder);
设置拍照预览的显示方向:由于摄像头预览的方向与实际方向相差90度角,所以要将显示方向旋转90度。
myCamera.setDisplayOrientation(90);
2)、surfaceChanged()
设置相机参数:
Camera.Parameters params = myCamera.getParameters();
params.setPictureFormat(PixelFormat.JPEG);
myCamera.setParameters(params);
摄像头开始预览
myCamera.startPreview();
相机对焦:
myCamera.autoFocus(new AutoFocusCallback(){
提示聚焦成功
});
3)、surfaceDestroyed()
停止摄像头预览
myCamera.stopPreview();
释放手机摄像头
myCamera.release();
myCamera = null;
(二)、相机拍照:
myCamera.takePicture(null, null, pictureCallback);
pictureCallback = new PictureCallback() {
onPictureTaken(byte[] data, Camera camera) {
// 获得拍摄的照片——Bitmap对象
Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
// 停止照片拍摄
myCamera.stopPreview();
// 创建操作图片用的matrix对象。因为照片方向与实际方向相差90度,所以此步的目的是实现图片旋转
Matrix matrix = new Matrix();
matrix.postRotate(90);
// 创建新的Bitmap对象 ,显示在预览区域
bm_camera = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
imageView_editpic.setImageBitmap(bm_camera);
}
}
(三)、保存图片进SD卡:
(四)、设置权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
(五)、使用ZoomControls浏览图片:【可选项】
import android.widget.ZoomControls;
// 定义图片缩放的步长值
private float scaleWidth = 1,scaleHeight = 1;
zoomControls = (ZoomControls) findViewById();
// 放大监听
zoomControls.setOnZoomInClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 设置图片缩放比例。单击放大,将以1.25倍的速率放大。
double scale = 1.25;
scaleWidth = (float) (scaleWidth * scale);
scaleHeight = (float) (scaleHeight * scale);
// 为了防止图片过大而超过内存,设置了一个极限值
if (scaleWidth > 1.25) {
scaleWidth = 1;
scaleHeight = 1;
}
// 产生新的Bitmap对象
Matrix matrix = new Matrix();
//重新整合矩阵对象
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizeBmp = Bitmap.createBitmap(bitmap_pic, 0, 0, bitmap_pic.getWidth(), bitmap_pic.getHeight(), matrix,
true);
imageView_picture.setImageBitmap(resizeBmp);
}
});
// 缩小监听
zoomControls.setOnZoomOutClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 设置图片缩放比例。单击缩小,图片将以0.8倍的速率缩小。
double scale = 0.8;
scaleWidth = (float) (scaleWidth * scale);
scaleHeight = (float) (scaleHeight * scale);
// 产生新的Bitmap对象
Matrix matrix = new Matrix();
//重新整合矩阵对象
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizeBmp = Bitmap.createBitmap(bitmap_pic, 0, 0, bitmap_pic.getWidth(), bitmap_pic.getHeight(), matrix,
true);
imageView_picture.setImageBitmap(resizeBmp);
}
});