当前位置:   article > 正文

Android Camera相机开发示例、Android 开发板 USB摄像头采集、定期拍照、定时拍照,安卓调用摄像头拍照、Android摄像头预览、监控,USB摄像头开发、摄像头监控代码_安卓调用usb摄像头

安卓调用usb摄像头

我们有个需求,在机器上加个摄像头,定时拍照;

我到网上搜索,发现没有快速上手和简单使用的;

个人感觉,大部分博客写得很乱,或者长篇大论;

而我只想简单实现功能,并不打算学习多少理论;

下面代码是我写来测试的,大家有需要可以参考;

能快速看到效果,实际使用可在这个基础上扩展。

 

 


先看下我使用的硬件,Android板和摄像头,如图:

首先我想说一下 SurfaceView 这个东西,这个是你希望在界面上看到摄像头拍到的内容(就是所谓“预览”)时才需要,如果你不需要预览可以不用它,不用它照样可以取得摄像头数据。

下面是我主要代码,大家看下一就明白,不用解析了,如下:

  1. package com.wongo.test.CommCamera;
  2. import android.graphics.SurfaceTexture;
  3. import android.hardware.Camera;
  4. import android.view.SurfaceHolder;
  5. import java.util.List;
  6. public class WGCameraManage {
  7. Camera mCamera;
  8. SurfaceTexture mSurfaceTexture = new SurfaceTexture(0);
  9. /**
  10. * 打开摄像头
  11. * @param cameraId 如:Camera.CameraInfo.CAMERA_FACING_BACK
  12. * @param surfaceHolder 用于预览的SurfaceHolder,可为null
  13. * @param previewCallback 预览回调,可为null
  14. * @return 返回null表示成功,其它表示具体错误信息
  15. */
  16. public String openCamera(int cameraId, SurfaceHolder surfaceHolder, Camera.PreviewCallback previewCallback) {
  17. releaseCamera();
  18. // 判断是否存在cameraId的相机
  19. boolean isExistCamera = false;
  20. Camera.CameraInfo info = new Camera.CameraInfo();
  21. for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
  22. Camera.getCameraInfo(i, info);
  23. if (info.facing == cameraId) {
  24. isExistCamera = true;
  25. break;
  26. }
  27. }
  28. if (isExistCamera) {
  29. //初始化相机配置信息
  30. try {
  31. mCamera = Camera.open(cameraId);
  32. int width = 0;
  33. int height = 0;
  34. Camera.Parameters mParameters = mCamera.getParameters();
  35. List<Camera.Size> sizeList = mParameters.getSupportedPreviewSizes();
  36. // 找到支持的最大尺寸
  37. for(int i = 0; i < sizeList.size(); i++) {
  38. Camera.Size size = sizeList.get(i);
  39. if (size.width > width) {
  40. width = size.width;
  41. height = size.height;
  42. }
  43. }
  44. //设置预览尺寸
  45. mParameters.setPreviewSize(width, height);
  46. //设置保存图片尺寸
  47. mParameters.setPictureSize(width, height);
  48. //设置图片质量为50
  49. //mParameters.setJpegQuality(50);
  50. mCamera.setParameters(mParameters);
  51. // 设置预览回调
  52. if (previewCallback != null) {
  53. mCamera.setPreviewCallback(previewCallback);
  54. }
  55. } catch (Exception e) {
  56. return "相机初始化失败:"+e.getLocalizedMessage();
  57. }
  58. // 开始预览
  59. try {
  60. if (surfaceHolder != null) {
  61. mCamera.setPreviewDisplay(surfaceHolder);
  62. } else {
  63. mCamera.setPreviewTexture(mSurfaceTexture);
  64. }
  65. mCamera.startPreview();
  66. } catch (Exception e) {
  67. return "打开预览出错:"+e.getLocalizedMessage();
  68. }
  69. } else {
  70. return "没找到对应相机";
  71. }
  72. return null;
  73. }
  74. /**
  75. * 拍照
  76. * @param callback
  77. */
  78. public void takePicture(final takePictureCallback callback) {
  79. if (mCamera == null) {
  80. if (callback != null) { callback.onError("相机未初始化成功"); }
  81. return;
  82. }
  83. try {
  84. mCamera.takePicture(null, null, null, new Camera.PictureCallback() {
  85. @Override
  86. public void onPictureTaken(byte[] data, Camera camera) {
  87. if (callback != null) {
  88. callback.onSuccess(data);
  89. }
  90. mCamera.startPreview();
  91. }
  92. });
  93. } catch (Exception e) {
  94. if (callback != null) {
  95. callback.onError(e.getLocalizedMessage());
  96. }
  97. }
  98. }
  99. /**
  100. * 释放相机
  101. */
  102. public void releaseCamera() {
  103. if (mCamera != null) {
  104. mCamera.stopPreview();
  105. mCamera.setPreviewCallback(null);
  106. mCamera.release();
  107. mCamera = null;
  108. }
  109. }
  110. /**
  111. * 拍照回调
  112. */
  113. public interface takePictureCallback {
  114. void onSuccess(byte[] data);
  115. void onError(String errMsg);
  116. }
  117. }

使用的话,就是创建WGCameraManage对象,调用openCamera方法,如果要保存照片就调用takePicture方法。

下面发一下,我测试使用的Activity代码,如下:

  1. package com.wongo.test;
  2. import android.hardware.Camera;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.SurfaceHolder;
  6. import android.view.SurfaceView;
  7. import android.widget.Toast;
  8. import com.wongo.test.CommCamera.WGCameraManage;
  9. import com.wongo.test.common.MyFileUtils;
  10. import java.io.File;
  11. import java.io.FileOutputStream;
  12. import java.text.SimpleDateFormat;
  13. import java.util.Locale;
  14. import java.util.Timer;
  15. import java.util.TimerTask;
  16. public class CameraActivity extends AppCompatActivity {
  17. WGCameraManage mCameraManage = new WGCameraManage();
  18. String pictureSaveRoot; // 照片保存的目录
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_camera);
  23. // 保存路径
  24. pictureSaveRoot = MyFileUtils.getSDCardPath("wongo/camera");
  25. File f = new File(pictureSaveRoot);
  26. if (!f.exists()) {
  27. f.mkdirs();
  28. }
  29. boolean isNeedPreview = true; // 是否需要预览
  30. if (isNeedPreview) {
  31. // 创建预览对象
  32. SurfaceView mSurfaceView = findViewById(R.id.surfaceView);
  33. SurfaceHolder mSurfaceHolder = mSurfaceView.getHolder();
  34. mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {
  35. @Override
  36. public void surfaceCreated(SurfaceHolder holder) {
  37. setupCamera(holder); //注意:要在这里调用
  38. }
  39. @Override
  40. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  41. }
  42. @Override
  43. public void surfaceDestroyed(SurfaceHolder holder) {
  44. }
  45. });
  46. } else {
  47. // 不需要预览,直接使用
  48. setupCamera(null);
  49. }
  50. }
  51. private void setupCamera(SurfaceHolder holder) {
  52. // 打开相机
  53. String errMsgForOpen = mCameraManage.openCamera(Camera.CameraInfo.CAMERA_FACING_BACK, holder, null);
  54. if (errMsgForOpen == null) {
  55. // 定时拍照
  56. Timer mTimer = new Timer();
  57. TimerTask mTask = new TimerTask() {
  58. @Override
  59. public void run() {
  60. mCameraManage.takePicture(new WGCameraManage.takePictureCallback() {
  61. @Override
  62. public void onSuccess(byte[] data) {
  63. savePictureToFile(data);
  64. }
  65. @Override
  66. public void onError(String errMsg) {
  67. alert("拍照失败:"+errMsg);
  68. }
  69. });
  70. }
  71. };
  72. mTimer.schedule(mTask, 10*1000, 10*1000);
  73. } else {
  74. alert(errMsgForOpen);
  75. }
  76. }
  77. private void savePictureToFile(byte[] data) {
  78. try {
  79. long millTime = System.currentTimeMillis();
  80. SimpleDateFormat dataFormat = new SimpleDateFormat("yyyyMMdd"+File.separator+"HH", Locale.getDefault());
  81. String saveDir = pictureSaveRoot + File.separator + dataFormat.format(millTime);
  82. File f = new File(saveDir);
  83. if (!f.exists()) {
  84. f.mkdirs();
  85. }
  86. SimpleDateFormat nameFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());
  87. String savePath = saveDir + File.separator + nameFormat.format(millTime) + ".jpg";
  88. FileOutputStream fos = new FileOutputStream(savePath);
  89. fos.write(data);
  90. fos.close();
  91. alert("保存照片完成");
  92. } catch (Exception e) {
  93. e.printStackTrace();
  94. alert("保存照片出错:"+e.getLocalizedMessage());
  95. }
  96. }
  97. private void alert(final String msg) {
  98. runOnUiThread(new Runnable() {
  99. @Override
  100. public void run() {
  101. Toast.makeText(CameraActivity.this, msg, Toast.LENGTH_SHORT).show();
  102. }
  103. });
  104. }
  105. @Override
  106. protected void onDestroy() {
  107. mCameraManage.releaseCamera();
  108. super.onDestroy();
  109. }
  110. }

还有权限声明,我这项目是测试专用的,本来就声明了各种权限,我看了下,相关的应该是下面这些:

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.CAMERA" />
  4. <uses-feature android:name="android.hardware.camera" />
  5. <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

 

----------------------------完--------------------------

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/263013
推荐阅读
相关标签
  

闽ICP备14008679号