Android自定义Camera相机(打开闪光灯、前后摄像头切换)

您所在的位置:网站首页 安卓手机禁用前置摄像头 Android自定义Camera相机(打开闪光灯、前后摄像头切换)

Android自定义Camera相机(打开闪光灯、前后摄像头切换)

2024-07-04 01:15:42| 来源: 网络整理| 查看: 265

想搞自定义相机很久了一直觉得很难所以一直拖着前两天有点闲就参考Android自定义相机超详细讲解搞了一下发现并不是那么难,嘿嘿~

一、参考布局

二、初始化相机

获取相机 /** * 获取照相机实例 * * @return */ private Camera getCamera() { Camera camera = null; if (CameraProvider.hasCamera()) { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.GINGERBREAD) { //打开摄像头 camera = Camera.open(); } else { //打开摄像头 camera = Camera.open(cameraType); } } else { ToastUtils.showShort("摄像头打开失败"); } return camera; }

这里需要说明一下:

在Android2.3以前是不支持前置摄像头的所以默认打开的是后置摄像头在Android2.3以后有了前置摄像头所以: cameraId:0是后置摄像头 1是前置摄像头 初始化相机信息 /** * 初始化相机 */ private void initCamera() { mCamera = getCamera(); if (mCamera != null) { pictureSizes.clear(); previewSizes.clear(); pictureSizes = mCamera.getParameters().getSupportedPictureSizes(); previewSizes = mCamera.getParameters().getSupportedPreviewSizes(); //得到摄像头的参数 parameters = mCamera.getParameters(); parameters.setJpegQuality(80);//设置照片的质量 parameters.setPreviewSize(previewSizes.get(0).width, previewSizes.get(0).height);//设置预览尺寸 parameters.setPictureSize(pictureSizes.get(0).width, pictureSizes.get(0).height);//设置照片分辨率 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);// 连续对焦模式 parameters.setFlashMode(flashMode); //Camera.Parameters.FOCUS_MODE_AUTO; //自动聚焦模式 //Camera.Parameters.FOCUS_MODE_INFINITY;//无穷远 //Camera.Parameters.FOCUS_MODE_MACRO;//微距 //Camera.Parameters.FOCUS_MODE_FIXED;//固定焦距 parameters.setRotation(90); //生成的图像旋转90度 mCamera.setParameters(parameters); isPreviewing = true; //设置摄像头角度 setCameraDisplayOrientation(CustomCameraActivity.this, 0, mCamera); } else { ToastUtils.showShort("摄像头打开失败"); } } 设置摄像头角度在有些手机上拍出来的照片会自动旋转角度 /** * 设置 摄像头的角度 * * @param activity 上下文 * @param cameraId 摄像头ID(假如手机有N个摄像头,cameraId 的值 就是 0 ~ N-1) * @param camera 摄像头对象 */ public static void setCameraDisplayOrientation(Activity activity, int cameraId, Camera camera) { Camera.CameraInfo info = new Camera.CameraInfo(); //获取摄像头信息 Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); //获取摄像头当前的角度 int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { // 前置摄像头 result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // 后置摄像头 result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); } 自定义SurfaceView public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private Camera mCamera ; private SurfaceHolder mHolder; public CameraPreview(Context context,Camera camera) { super(context); mCamera = camera; //获取SurfaceHolder mHolder = getHolder(); //为SurfaceHolder设置回调 mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceCreated(SurfaceHolder holder) { // 当Surface被创建之后,开始Camera的预览 try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { Log.d(TAG, "预览失败"); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // Surface发生改变的时候将被调用,第一次显示到界面的时候也会被调用 if (mHolder.getSurface() == null){ // 如果Surface为空,不继续操作 return; } // 停止Camera的预览 try { mCamera.stopPreview(); } catch (Exception e){ Log.d(TAG, "当Surface改变后,停止预览出错"); } // 重新开始预览 try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e){ Log.d(TAG, "预览Camera出错"); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { } } 添加SurfaceView cameraPreview = new CameraPreview(mContext, mCamera); diyCameraFyContext.addView(cameraPreview); 拍摄照片 mCamera.takePicture(null, null, (data, camera) -> { Bitmap mbitmap = BitmapFactory.decodeByteArray(data, 0, data.length); }); 切换摄像头 Camera.open( Camera.CameraInfo.CAMERA_FACING_FRONT/CAMERA_FACING_BACK); 打开关闭/闪光灯 parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH / FLASH_MODE_OFF); 恢复对焦模式 mCamera.cancelAutoFocus(); //恢复对焦模式 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); parameters.setFocusAreas(null); mCamera.setParameters(parameters); mCamera.startPreview(); 打开、销毁相机节省资源 @Override protected void onDestroy() { super.onDestroy(); // 回收Camera资源 if (mCamera != null) { mCamera.release(); mCamera = null; } } @Override protected void onResume() { super.onResume(); if (mCamera != null) { mCamera.startPreview(); } } @Override public void onStop() { super.onStop(); if (mCamera != null) { mCamera.stopPreview(); } } /** * 停止销毁摄像机 */ private void stopCamera() { if (mCamera != null) { //停止当前摄像头预览 mCamera.stopPreview(); //释放摄像机资源 mCamera.release(); mCamera = null; } }

Github:https://github.com/distantplace-z/BaseTools/blob/master/sample/src/main/java/com/xiaohou/sample/ui/camera/CustomCameraActivity.java

温馨提示: 此文章是基于Camera的在Android SDK 21(LOLLIPOP)以后已经弃用Camera了开始使用Camera2但是那么问题来了我们需不需要根据Android SDK来写对应版本的Camera呢?答案是要滴但是呢有个好消息就是Google出了cameraview解决了我们一大部分问题,但是Camera2是一个很强大的库具体有多强大待博主一探究竟…



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭