Android surfaceview 自定义相机 拍照(闪光灯、前后摄像头)
来源:互联网 发布:个人所得税软件v3.0 编辑:程序博客网 时间:2024/05/17 04:37
在我们app中经常会调用相机进行拍照,然后把拍下来的图片保存在本地,再上传到服务端,网上有不少自定义的相机,也下载了不少,但是效果还是不满意,所以决定自定义下,不多说了,直接上代码:
public class CameraViews extends SurfaceView implements SurfaceHolder.Callback{ private String TAG=Camera.class.getName(); private Activity mActivity=null; private Camera camera=null; private SurfaceHolder holder=null; /* 是否打开前置相机,true为前置,false为后置 */ private boolean mIsFrontCamera=false; /是否开启闪光灯 默认关闭闪光灯/ private String isOpenFlashMode= Camera.Parameters.FLASH_MODE_OFF; private int curRotation=0; private CameraCallback mCallback=null;public CameraViews(Context context){ super(context); initSurface();}public CameraViews(Context context, AttributeSet attrs) { super(context, attrs); initSurface();}public void setCurActivity(Activity activity){ this.mActivity=activity;}/** * @Description: 初始化surface */private void initSurface(){ holder =getHolder();//获得句柄 holder.addCallback(this);//添加回调 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//surfaceview不维护自己的缓冲区,等待屏幕渲染引擎将内容推送到用户面前}@Overridepublic void surfaceCreated(SurfaceHolder holder) { try { if(camera==null){ openCamera(); } initCameraParams(mActivity); camera.setPreviewDisplay(getHolder()); camera.startPreview(); } catch (Exception e) { Toast.makeText(getContext(), "打开相机失败", Toast.LENGTH_SHORT).show(); Log.e(TAG,e.getMessage()); }}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {//try{ //camera.stopPreview(); //摄像头画面显示在Surface上 //camera.setPreviewDisplay(holder); //initCameraParams(mActivity); //camera.startPreview(); //}catch(IOException e) { // if (camera != null) camera.release(); //camera = null;//} //注意:这里不能进行重新初始化相机,然后在预览,不然进行横纵拍照,照出来的图片旋转的角度会对应不上,所以这里直接开启预览就好 camera.startPreview(); }@Overridepublic void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); camera=null; holder=null;}@SuppressWarnings("unused")private PictureCallback pictureCallback=new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { saveCameraImage(data, camera); //这句话也很重要,是将你拍照成功后,图片可以在相册中查看到。(只不过我把这句话封装到保存图片中,保存图片顺带加载到相册)。 //MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "", ""); //重新打开预览图,进行下一次的拍照准备 camera.startPreview(); }};/** * @Description:设置相机预览 * @param activity **/public void setCameraPreView(){ if(camera!=null){ camera.stopPreview(); initCameraParams(mActivity); try { camera.setPreviewDisplay(getHolder()); camera.startPreview(); } catch (IOException e) { Log.e(">>>>>","相机转换失败!"+e.getMessage()); } }else{ Log.e(">>>>>","相机初始化失败!"); }}/** * @Description:保存拍照的图片 * @Since:2015-8-11 * @Version:1.1.0 * @param data * @param camera */private void saveCameraImage(byte[] data, Camera camera) { if(data==null){ Log.e(TAG, "获取图片流失败,拍照失败,请重试!"); return; } if(isFrontCamera()){ if(curRotation==90){ curRotation=270; }else if(curRotation==270){ curRotation=90; } } Bitmap thumbBM=null; thumbBM=BitmapUtils.getInstance().save(mActivity,data,curRotation); mCallback.onCameraCallback(thumbBM); thumbBM=null;}/** * @Description:设置相机参数 */public void initCameraParams(Activity activity){ Camera.Parameters parameters = camera.getParameters(); // 选择合适的预览尺寸 List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes(); if (sizeList.size()>0) { Size cameraSize=sizeList.get(0); //预览图片大小 parameters.setPreviewSize(cameraSize.width, cameraSize.height); } //设置生成的图片大小 sizeList = parameters.getSupportedPictureSizes(); if (sizeList.size()>0) { Size cameraSize=sizeList.get(0); for (Size size : sizeList) { //小于100W像素 if (size.width*size.height<100*10000) { cameraSize=size; break; } } parameters.setPictureSize(cameraSize.width, cameraSize.height); } //设置图片格式 parameters.setPictureFormat(ImageFormat.JPEG); parameters.setJpegQuality(100); parameters.setJpegThumbnailQuality(100); //自动聚焦模式 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); parameters.setFlashMode(getIsOpenFlashMode()); //curRotation=getPreviewDegree(); screenDirectionListener(); //Log.e(">>>>>","curRotation:"+curRotation); //parameters.setRotation(curRotation);//生成的图片转90° //camera.setDisplayOrientation(curRotation);//预览转90°预览图片旋转90° //camera.setDisplayOrientation(getPreviewDegree());//预览旋转90° camera.setDisplayOrientation(90); camera.setParameters(parameters);}public String getIsOpenFlashMode() { return isOpenFlashMode;}/** * @Description: 设置开启闪光灯(重新预览) * @param mIsOpenFlashMode */public void setIsOpenFlashMode(boolean mIsOpenFlashMode) { if(mIsOpenFlashMode) this.isOpenFlashMode = Camera.Parameters.FLASH_MODE_ON; else this.isOpenFlashMode = Camera.Parameters.FLASH_MODE_OFF;; setCameraPreView();//重新预览相机}/** * 根据当前照相机状态(前置或后置),打开对应相机 */private boolean openCamera() { if (camera != null) { camera.stopPreview(); camera.release(); camera = null; } if(mIsFrontCamera){ Camera.CameraInfo cameraInfo=new CameraInfo(); for (int i = 0; i < Camera.getNumberOfCameras(); i++) { Camera.getCameraInfo(i, cameraInfo); if(cameraInfo.facing==Camera.CameraInfo.CAMERA_FACING_FRONT){ try { camera=Camera.open(i); } catch (Exception e) { camera =null; return false; } } } }else { try { camera=Camera.open(); } catch (Exception e) { camera =null; return false; } } return true;}/** * @Description:获取相机摄像头个数 * @return */public int getCameraCount(){ return Camera.getNumberOfCameras();//得到摄像头的个数}private boolean isFrontCamera(){ return mIsFrontCamera;}/** * @Description:转换前置和后置照相机 * @return */public boolean switchCamera(){ mIsFrontCamera=!mIsFrontCamera; openCamera(); if(camera!=null){ initCameraParams(mActivity); //updateCameraOrientation(); try { camera.setPreviewDisplay(getHolder()); camera.startPreview(); } catch (IOException e) { Log.e(">>>>>","相机转换失败!"+e.getMessage()); } } return mIsFrontCamera;}/** * @Description: 拍照 * @param mCameraCallback */public void takePhoto(CameraCallback mCameraCallback){ try { initSurface(); initCameraParams(mActivity); camera.takePicture(null, null, pictureCallback);//将拍摄到的照片给自定义的对象 this.mCallback=mCameraCallback; } catch (Exception e) { Toast.makeText(mActivity,"初始化相机失败!",Toast.LENGTH_SHORT).show(); }}public interface CameraCallback{ void onCameraCallback(Bitmap bitmap);}/** * @Description: 监听屏幕的旋转方向 */private void screenDirectionListener(){ OrientationEventListener mOrEventListener =new OrientationEventListener(getContext()) { @Override public void onOrientationChanged(int rotation) { //getScreenDirect(); if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation>=135)&&(rotation<=225))){////portrait } else if (((rotation > 45) && (rotation < 135))||((rotation>225)&&(rotation<315))) {//landscape } if (((rotation >= 0) && (rotation <= 45)) || (rotation > 315)){//纵屏向上 rotation=90; }else if ((rotation > 45) && (rotation <= 135)) {//横屏向右 rotation=180; } else if ((rotation > 135) && (rotation <= 225)) {//纵屏向下 rotation=270; } else if((rotation > 225) && (rotation <= 315)) { //横屏向左 rotation=0; }else { rotation=0; } curRotation=rotation; } }; mOrEventListener.enable();}
阅读全文
0 0
- Android surfaceview 自定义相机 拍照(闪光灯、前后摄像头)
- Android surfaceview 自定义相机 拍照(闪光灯、前后摄像头)
- Android自定义相机,切换前后摄像头,照相机拍照
- 【Android】自定义相机的实现(支持连续拍照、前后摄像头切换、连续对焦)
- Android 相机开发 闪光灯,前后摄像头切换,调整缩放比例
- SurfaceView Android摄像头拍照
- SurfaceView Android摄像头拍照
- Android 自定义Camera全屏拍照,支持前后摄像头
- android 相机 前后摄像头判断
- android自定义相机 前置摄像头拍照,照片旋转180
- android自定义相机拍照
- Android 自定义相机摄像头
- Android相机(摄像头)圆形预览窗口,圆形SurfaceView
- Android--相机预览及拍照临时文件/SurfaceView
- Android--相机预览及拍照临时文件/SurfaceView
- Android--相机预览及拍照临时文件/SurfaceView
- 相机的功能丰富,加入前后摄像头的翻转,闪光灯,对焦功能。
- Android 拍照是开启(调用)闪光灯
- ceffe 中Relu的理解
- 好开发的工具
- C++ 神经网络 实现 AND 操作符
- 机器学习——boosting 与 bagging 知识点+面试题总结
- 博客开创第一天,
- Android surfaceview 自定义相机 拍照(闪光灯、前后摄像头)
- 3.表单和图片
- 欢迎使用CSDN-markdown编辑器
- Android:ListView中包含EditText 文字冲突 复用 焦点 软键盘问题
- appium+java(三)webview
- 从一个java项目里面读取多个Java文件到一个txt实现备份
- Java源码阅读的真实体会(一种学习思路)
- HNCU 1746: 算法4-1,4-3:定位子串
- 欢迎使用CSDN-markdown编辑器