Android CameraManager类详解

作者:落單的戀人 时间:2022-06-12 13:05:52 

本文实例为大家分享了Android CameraManager类的具体代码,供大家参考,具体内容如下

先看代码:


 private SurfaceView mSurfaceView;
 private SurfaceHolder mSurfaceHolder;
 private CameraManager cameraManager;

cameraManager = new CameraManager(this);
   mSurfaceView = (SurfaceView) findViewById(R.id.java_surface_view);
   mSurfaceHolder = mSurfaceView.getHolder();

// mSurfaceView 不需要自己的缓冲区
   mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
   // mSurfaceView添加回调
   mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {
     @Override
     public void surfaceCreated(SurfaceHolder holder) { //SurfaceView创建
       try {
         cameraManager.openDriver(mSurfaceHolder);
         cameraManager.startPreview();
       } catch (IOException e) {
         e.printStackTrace();
       }
     }

@Override
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
     public void surfaceDestroyed(SurfaceHolder holder) { //SurfaceView销毁
       holder.removeCallback(this); // Camera is being used after Camera.release() was called
       cameraManager.stopPreview();
       cameraManager.closeDriver();

}
   });

自定义一个 CameraManager 类,在关闭当前页面,释放camera资源时偶尔报错

Camera is being used after Camera.release() was called

第一次,加了一句 holder.removeCallback(this); 运行发现还是时不时出现报错。

第二次在释放 camera前加  camera.setPreviewCallback(null); 问题解决。


 /**
  * 关闭预览
  */
 public synchronized void stopPreview() {
   Log.e(TAG, "stopPreview");
   if (autoFocusManager != null) {
     autoFocusManager.stop();
     autoFocusManager = null;
   }
   if (camera != null && previewing) {
     camera.stopPreview();
     camera.setPreviewCallback(null); // Camera is being used after Camera.release() was called
     previewing = false;
   }
 }

/**
  * 关闭camera
  */
 public synchronized void closeDriver() {
   Log.e(TAG, "closeDriver");
   if (camera != null) {
     camera.release();
     camera = null;
   }
 }

附:CameraManager类:


package com.lemoncome.facedetection;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.util.Log;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.WindowManager;

import java.io.IOException;
import java.util.List;

/**
* User:lizhangqu(513163535@qq.com)
* Date:2015-09-05
* Time: 10:56
*/
public class CameraManager implements Camera.PreviewCallback {
 private static final String TAG = CameraManager.class.getName();
 private Camera camera;
 private Camera.Parameters parameters;
 private AutoFocusManager autoFocusManager;
 private int requestedCameraId = -1;
 private Context mContext;

private boolean initialized;
 private boolean previewing;

/**
  * 打开摄像头
  *
  * @param cameraId 摄像头id
  * @return Camera
  */
 public Camera open(int cameraId) {
   int numCameras = Camera.getNumberOfCameras();
   if (numCameras == 0) {
     Log.e(TAG, "No cameras!");
     return null;
   }
   boolean explicitRequest = cameraId >= 0;
   if (!explicitRequest) {
     // Select a camera if no explicit camera requested
     int index = 0;
     while (index < numCameras) {
       Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
       Camera.getCameraInfo(index, cameraInfo);
       if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
         break;
       }
       index++;
     }
     cameraId = index;
   }
   Camera camera;
   if (cameraId < numCameras) {
     Log.e(TAG, "Opening camera #" + cameraId);
     camera = Camera.open(cameraId);
   } else {
     if (explicitRequest) {
       Log.e(TAG, "Requested camera does not exist: " + cameraId);
       camera = null;
     } else {
       Log.e(TAG, "No camera facing back; returning camera #0");
       camera = Camera.open(0);
     }
   }
   int rotation = getDisplayOrientation();
   camera.setDisplayOrientation(rotation);
   camera.setPreviewCallback(this);
   return camera;
 }

public int getDisplayOrientation() {
   Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
   int rotation = display.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;
   }

Camera.CameraInfo camInfo =
       new Camera.CameraInfo();
   Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, camInfo);

int result = (camInfo.orientation - degrees + 360) % 360;
   return result;
 }

public CameraManager(Context context) {
   mContext = context;
 }

/**
  * 打开camera
  *
  * @param holder SurfaceHolder
  * @throws IOException IOException
  */
 public synchronized void openDriver(SurfaceHolder holder)
     throws IOException {
   Log.e(TAG, "openDriver");
   Camera theCamera = camera;
   if (theCamera == null) {
     theCamera = open(requestedCameraId);
     if (theCamera == null) {
       throw new IOException();
     }
     camera = theCamera;
   }
   theCamera.setPreviewDisplay(holder);

if (!initialized) {
     initialized = true;
     parameters = camera.getParameters();
     List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();

int w = 800;
     int h = 600;
     for (Camera.Size size : previewSizes) {
       Log.e("TAG", "previewSizes width:" + size.width);
       Log.e("TAG", "previewSizes height:" + size.height);
       if (size.width - w <= 100 & size.width >= w) {
         w = size.width;
         h = size.height;
         break;
       }
     }

parameters.setPreviewSize(w, h);
     parameters.setPictureFormat(ImageFormat.JPEG);
     parameters.setJpegQuality(100);
     parameters.setPictureSize(800, 600);
     theCamera.setParameters(parameters);
   }
 }

/**
  * camera是否打开
  *
  * @return camera是否打开
  */
 public synchronized boolean isOpen() {
   return camera != null;
 }

/**
  * 关闭camera
  */
 public synchronized void closeDriver() {
   Log.e(TAG, "closeDriver");
   if (camera != null) {
     camera.release();
     camera = null;
   }
 }

/**
  * 开始预览
  */
 public synchronized void startPreview() {
   Log.e(TAG, "startPreview");
   Camera theCamera = camera;
   if (theCamera != null && !previewing) {
     theCamera.startPreview();
     previewing = true;
     autoFocusManager = new AutoFocusManager(camera);
   }
 }

/**
  * 关闭预览
  */
 public synchronized void stopPreview() {
   Log.e(TAG, "stopPreview");
   if (autoFocusManager != null) {
     autoFocusManager.stop();
     autoFocusManager = null;
   }
   if (camera != null && previewing) {
     camera.stopPreview();
     camera.setPreviewCallback(null); // Camera is being used after Camera.release() was called
     previewing = false;
   }
 }

public void setPreviewCallback(Camera.PreviewCallback cb) {
   camera.setOneShotPreviewCallback(this);
 }

/**
  * 打开闪光灯
  */
 public synchronized void openLight() {
   Log.e(TAG, "openLight");
   if (camera != null) {
     parameters = camera.getParameters();
     parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
     camera.setParameters(parameters);
   }
 }

/**
  * 关闭闪光灯
  */
 public synchronized void offLight() {
   Log.e(TAG, "offLight");
   if (camera != null) {
     parameters = camera.getParameters();
     parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
     camera.setParameters(parameters);
   }
 }

/**
  * 拍照
  *
  * @param shutter ShutterCallback
  * @param raw   PictureCallback
  * @param jpeg  PictureCallback
  */
 public synchronized void takePicture(final Camera.ShutterCallback shutter, final Camera.PictureCallback raw,
                    final Camera.PictureCallback jpeg) {
   camera.takePicture(shutter, raw, jpeg);
 }

@Override
 public void onPreviewFrame(byte[] bytes, Camera camera) {

}

private Bitmap reSize(byte[] data) {
   Log.i(TAG, "myJpegCallback:onPictureTaken...");
   Bitmap cutMap = BitmapFactory.decodeByteArray(data, 0, data.length);//data是字节数据,将其解析成位图
   //设置FOCUS_MODE_CONTINUOUS_VIDEO)之后,myParam.set("rotation", 90)失效。图片竟然不能旋转了,故这里要旋转下
   Matrix matrix = new Matrix();
   matrix.postRotate((float) 90.0);
   Bitmap rotaBitmap = Bitmap.createBitmap(cutMap, 0, 0, cutMap.getWidth(), cutMap.getHeight(), matrix, false);

//旋转后rotaBitmap是960×1280.预览surfaview的大小是540×800
   //将960×1280缩放到540×800
   Bitmap sizeBitmap = Bitmap.createScaledBitmap(rotaBitmap, 540, 800, true);
   Bitmap rectBitmap = Bitmap.createBitmap(sizeBitmap, 100, 200, 300, 300);//截取
   return rectBitmap;
 }
}

来源:http://www.cnblogs.com/haoxr/p/7680140.html

标签:Android,CameraManager
0
投稿

猜你喜欢

  • Java编程实现向文本文件中读取数据之Scanner用法示例

    2022-08-01 03:38:57
  • SpringBoot+hutool实现图片验证码

    2021-06-17 02:55:27
  • java的三种随机数生成方式

    2022-03-06 13:43:57
  • 详解SpringBoot Start组件开发之记录接口日志信息

    2023-07-26 18:33:34
  • 使用C++ Matlab中的lp2lp函数教程详解

    2023-07-13 17:13:12
  • springcloud中RabbitMQ死信队列与延迟交换机实现方法

    2023-05-04 04:25:54
  • springcloud LogBack日志使用详解

    2021-12-23 15:17:05
  • Android 嵌套Fragment的使用实例代码

    2022-07-18 06:37:15
  • Android 读取资源文件实例详解

    2022-08-28 13:31:17
  • SpringBoot 整合mybatis+mybatis-plus的详细步骤

    2022-09-29 21:06:10
  • 基于WPF实现面包屑控件的示例代码

    2021-12-19 12:34:33
  • 关于Springboot数据库配置文件明文密码加密解密的问题

    2023-11-25 03:29:46
  • SpringMVC自定义拦截 器登录检测功能的实现代码

    2023-07-27 18:33:05
  • C#基础教程之IComparable用法,实现List<T>.sort()排序

    2023-11-03 07:07:46
  • C#实现中英文混合字符串截取的方法

    2022-07-11 10:02:35
  • C#使用System.Net邮件发送功能踩过的坑

    2022-09-09 18:16:11
  • C#实现系统休眠或静止休眠的方法

    2023-12-19 01:55:29
  • java并发编程专题(一)----线程基础知识

    2021-10-30 00:28:42
  • Kotlin 和 Java 混合开发入门教程

    2023-07-06 01:41:51
  • C++容器适配与栈的实现及dequeque和优先级详解

    2023-11-02 12:57:52
  • asp之家 软件编程 m.aspxhome.com