今天学习了android开发中的相机的开发,总结了关于android中相机的开发流程:
*使用surfaceview进行预览
- <uses-permission android:name=“android.permission.CAMERA”/>
- <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1.布局文件:
- <SurfaceView
- android:id=“@+id/svPreview”
- android:layout_width=“match_parent”
- android:layout_height=“match_parent” />
<SurfaceView android:id="@+id/svPreview" android:layout_width="match_parent" android:layout_height="match_parent" />
2.为surfaceview设置callback
- mSfPreview.getHolder().addCallback(new SfCallback());
- public class SfCallback implements SurfaceHolder.Callback{
- /**
- * 设置相机属性
- */
- void setCamera(){
- Camera.Parameters parameters = mCamera.getParameters();
- //得到相机支持的拍照分辨率,按大小排列(有的手机从大到小,有的从小到大)
- List<Camera.Size> listSize = parameters .getSupportedPictureSizes();
- // 从大到小排列的情况下,设置照片的大小,只能设置成支持的size,不能随意设置
- //不同的机型,listSize中的值的顺序不同,需要查看本机在哪个值的时候最清晰
- parameters.setPictureSize(listSize.get(0).width,listSize.get(0).height);
- // 设置图片格式
- parameters.setPictureFormat(ImageFormat.JPEG);
- //默认情况下相机是横向的,这里只是改变预览的方向
- mCamera.setDisplayOrientation(90);
- //将参数设置到Camera对象中
- mCamera.setParameters(parameters);
- }
- /**
- * 创建的时候调用
- * @param holder
- */
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- mCamera = Camera.open();//打开相机
- try {
- setCamera();
- mCamera.setPreviewDisplay(holder);
- mCamera.startPreview();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 状态改变的时候调用
- * @param holder
- * @param format
- * @param width
- * @param height
- */
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- //自动对焦
- mCamera.autoFocus(null);
- }
- /**
- * 销毁的时候调用
- * @param holder
- */
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- //释放camera
- if(mCamera != null){
- mCamera.release();
- mCamera = null;
- }
- }
- }
mSfPreview.getHolder().addCallback(new SfCallback()); public class SfCallback implements SurfaceHolder.Callback{ /** * 设置相机属性 */ void setCamera(){ Camera.Parameters parameters = mCamera.getParameters(); //得到相机支持的拍照分辨率,按大小排列(有的手机从大到小,有的从小到大) List<Camera.Size> listSize = parameters .getSupportedPictureSizes(); // 从大到小排列的情况下,设置照片的大小,只能设置成支持的size,不能随意设置 //不同的机型,listSize中的值的顺序不同,需要查看本机在哪个值的时候最清晰 parameters.setPictureSize(listSize.get(0).width,listSize.get(0).height); // 设置图片格式 parameters.setPictureFormat(ImageFormat.JPEG); //默认情况下相机是横向的,这里只是改变预览的方向 mCamera.setDisplayOrientation(90); //将参数设置到Camera对象中 mCamera.setParameters(parameters); } /** * 创建的时候调用 * @param holder */ @Override public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open();//打开相机 try { setCamera(); mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } /** * 状态改变的时候调用 * @param holder * @param format * @param width * @param height */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //自动对焦 mCamera.autoFocus(null); } /** * 销毁的时候调用 * @param holder */ @Override public void surfaceDestroyed(SurfaceHolder holder) { //释放camera if(mCamera != null){ mCamera.release(); mCamera = null; } } }
3.拍照开始
- @OnClick(R.id.btBegin)
- public void capturePhoto(View view) {
- /*第一个参数按下快门时回调,
- *第二个参数处理原始的照片数据,
- *第三个参数处理jpeg格式照片,一般用于存放照片
- */
- mCamera.takePicture(null, null, new Camera.PictureCallback() {
- @Override
- public void onPictureTaken(byte[] data, Camera camera) {
- Bitmap bmSrc = BitmapFactory.decodeByteArray(data,
- 0,data.length);
- Bitmap bmRotate = RotateBitmap(bmSrc);//旋转
- saveBitmap(bmRotate);//保存
- //重新开启预览
- mCamera.startPreview();
- }
- });
- }
@OnClick(R.id.btBegin) public void capturePhoto(View view) { /*第一个参数按下快门时回调, *第二个参数处理原始的照片数据, *第三个参数处理jpeg格式照片,一般用于存放照片 */ mCamera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { Bitmap bmSrc = BitmapFactory.decodeByteArray(data, 0,data.length); Bitmap bmRotate = RotateBitmap(bmSrc);//旋转 saveBitmap(bmRotate);//保存 //重新开启预览 mCamera.startPreview(); } }); }
3.1.旋转图片
- /**
- * 旋转照片
- *
- * @param bmSrc
- */
- public Bitmap RotateBitmap(Bitmap bmSrc) {
- Bitmap bmRotate = null;
- Matrix matrix = new Matrix();
- matrix.setRotate(90);//顺时针旋转90度
- bmRotate = Bitmap.createBitmap(bmSrc, 0, 0,
- bmSrc.getWidth(), bmSrc.getHeight(),matrix, true);
- bmSrc.recycle();
- return bmRotate;
- }
/** * 旋转照片 * * @param bmSrc */ public Bitmap RotateBitmap(Bitmap bmSrc) { Bitmap bmRotate = null; Matrix matrix = new Matrix(); matrix.setRotate(90);//顺时针旋转90度 bmRotate = Bitmap.createBitmap(bmSrc, 0, 0, bmSrc.getWidth(), bmSrc.getHeight(),matrix, true); bmSrc.recycle(); return bmRotate; }
3.2.保存照片
- /**
- * 保存图片
- * @param bmToSave
- */
- public void saveBitmap(Bitmap bmToSave) {
- //以时间为文件名
- SimpleDateFormat simpleDateFormat =
- new SimpleDateFormat(“yyyyMMddhhmmss”);
- String time = simpleDateFormat.format(new Date());
- File file = new File(“/sdcard/” + time + “.jpg”);
- BufferedOutputStream bufferedOutputStream = null;
- try {
- bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
- bmToSave.compress(Bitmap.CompressFormat.JPEG,
- 100,bufferedOutputStream);//将图片压缩到流中
- bufferedOutputStream.flush();//输出缓冲区的内容到本地
- bufferedOutputStream.close();//关闭
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
/** * 保存图片 * @param bmToSave */ public void saveBitmap(Bitmap bmToSave) { //以时间为文件名 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddhhmmss"); String time = simpleDateFormat.format(new Date()); File file = new File("/sdcard/" + time + ".jpg"); BufferedOutputStream bufferedOutputStream = null; try { bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file)); bmToSave.compress(Bitmap.CompressFormat.JPEG, 100,bufferedOutputStream);//将图片压缩到流中 bufferedOutputStream.flush();//输出缓冲区的内容到本地 bufferedOutputStream.close();//关闭 } catch (Exception e) { e.printStackTrace(); } }