今天学习了android开发中的相机的开发,总结了关于android中相机的开发流程:
*使用surfaceview进行预览
*需要开启的权限 [html] view plain copy print ? <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.布局文件:
[html] view plain copy print ? <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 [java] view plain copy print ? 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.拍照开始
[java] view plain copy print ? @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.旋转图片 [java] view plain copy print ? /** * 旋转照片 * * @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.保存照片 [java] view plain copy print ? /** * 保存图片 * @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(); } }