参考文章:
https://blog.csdn.net/u011418943/article/details/107256406
https://blog.csdn.net/xiaodongvtion/article/details/110951754

Camera1的类android.hardware.Camera。Camera类常用的方法:

方法

描述

getParameters()

获取摄像头参数

setParameters()

设置摄像头参数

setPreviewDisplay()

为摄像头指定一个显示预览画面的SurfaceView

open()

打开摄像头

startPreview()

开始预览

stopPreview()

停止预览

release()

释放摄像头资源

takePicture()

进行拍照

1 代码

CameraPreview:

GitHub - hanyuhang-hz/android-demos

MainActivity.java

public class MainActivity extends Activity {public final static String TAG = "CameraPreview";private Camera camera;private boolean isPreview = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.CAMERA}, 1);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);}// 设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 判断手机是否安装SD卡if (!android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {Toast.makeText(this, "请安装SD卡!", Toast.LENGTH_SHORT).show();}SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);final SurfaceHolder surfaceHolder = surfaceView.getHolder();// 设置该SurfaceHolder自己不维护缓冲surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);ImageButton preview = (ImageButton) findViewById(R.id.preview);preview.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 如果相机为非预览模式,则打开相机if (!isPreview) {camera = Camera.open();isPreview = true;}try {// 设置用于显示预览的SurfaceViewcamera.setPreviewDisplay(surfaceHolder);Camera.Parameters parameters = camera.getParameters();// 测试Camera.Parameters// (1)setPictureFormat======================================// PixelFormat.JPEG:jpeg// parameters.setPictureFormat(PixelFormat.JPEG);     // 指定图片为JPEG图片// parameters.set("jpeg-quality", 80);                // 设置图片的质量// PixelFormat.YCbCr_420_SP:NV21,等价于ImageFormat.NV21parameters.setPictureFormat(PixelFormat.YCbCr_420_SP);// (2)setWhiteBalance======================================// autoString whiteBalance = parameters.getWhiteBalance();Log.d(TAG, "whiteBalance:" + whiteBalance);// WHITE_BALANCE_INCANDESCENT:偏蓝// WHITE_BALANCE_FLUORESCENT:偏淡蓝// WHITE_BALANCE_WARM_FLUORESCENT:偏淡蓝// WHITE_BALANCE_DAYLIGHT:日光,正常// WHITE_BALANCE_CLOUDY_DAYLIGHT:阴天,偏黄// WHITE_BALANCE_TWILIGHT:暮光,偏黄// WHITE_BALANCE_SHADE:偏黄parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_DAYLIGHT);whiteBalance = parameters.getWhiteBalance();Log.d(TAG, "whiteBalance:" + whiteBalance);// (3)setExposureCompensation======================================曝光补偿int minEx = parameters.getMinExposureCompensation();int maxEx = parameters.getMaxExposureCompensation();float stepEx = parameters.getExposureCompensationStep();Log.d(TAG, "minEx:" + minEx + " maxEx:" + maxEx + " stepEx:" + stepEx);parameters.setExposureCompensation(6);// (4)setAutoExposureLock======================================boolean isAELS = parameters.isAutoExposureLockSupported();Log.d(TAG, "isAES:" + isAELS);boolean getAELS = parameters.getAutoExposureLock();Log.d(TAG, "getAES:" + getAELS);parameters.setAutoExposureLock(false);getAELS = parameters.getAutoExposureLock();Log.d(TAG, "getAES:" + getAELS);// (5)setAutoWhiteBalanceLock======================================boolean isAWBLS = parameters.isAutoWhiteBalanceLockSupported();Log.d(TAG, "isAWBLS:" + isAWBLS);boolean getAWBL = parameters.getAutoWhiteBalanceLock();Log.d(TAG, "getAWBL:" + getAWBL);parameters.setAutoWhiteBalanceLock(false);getAWBL = parameters.getAutoWhiteBalanceLock();Log.d(TAG, "getAWBL:" + getAWBL);// (5)setFocusMode======================================String fm = parameters.getFocusMode();Log.d(TAG, "fm:" + fm);// FOCUS_MODE_AUTO:聚焦// FOCUS_MODE_INFINITY:不聚焦// FOCUS_MODE_MACRO:聚焦// FOCUS_MODE_CONTINUOUS_VIDEO:跟随预览的物体远近自动聚焦,afcb返回fail// FOCUS_MODE_CONTINUOUS_PICTURE:跟随预览的物体远近自动聚焦,afcb返回failparameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);fm = parameters.getFocusMode();Log.d(TAG, "fm:" + fm);camera.setParameters(parameters);camera.startPreview();// AF:自动对焦camera.autoFocus(afcb);camera.setDisplayOrientation(90);} catch (IOException e) {e.printStackTrace();}}});ImageButton takePicture = (ImageButton) findViewById(R.id.takephoto);takePicture.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (camera != null) {camera.takePicture(null, null, jpeg);}}});}final Camera.AutoFocusCallback afcb = new Camera.AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {if(success) {// success表示对焦成功Log.d(TAG, "afcb: success");//camera.setOneShotPreviewCallback(null);}else {// 未对焦成功Log.d(TAG, "afcb: fail");}}};// 照片回调函数,实现将照片保存到系统图库中final Camera.PictureCallback jpeg = new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// 根据拍照所得的数据创建位图final Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);camera.stopPreview();isPreview = false;Log.d(TAG, "Environment.getExternalStorageDirectory():" + Environment.getExternalStorageDirectory());//获取sd卡根目录File appDir = new File(Environment.getExternalStorageDirectory(), "/DCIM/Camera/");if (!appDir.exists()) {      // 如果该目录不存在就创建该目录appDir.mkdir();}String fileName = System.currentTimeMillis() + ".jpg";File file = new File(appDir, fileName);// 保存拍到的图片try {FileOutputStream fos = new FileOutputStream(file);  // 创建一个文件输出流对象boolean ret = bm.compress(Bitmap.CompressFormat.JPEG, 100, fos);  // 将图片内容压缩为JPEG格式输出到输出流对象中Log.d(TAG, "bm.compress ret:" + ret);fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}//将照片插入到系统图库try {MediaStore.Images.Media.insertImage(MainActivity.this.getContentResolver(),file.getAbsolutePath(), fileName, null);} catch (FileNotFoundException e) {e.printStackTrace();}// 最后通知图库更新MainActivity.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.parse("file://" + "")));Toast.makeText(MainActivity.this, "照片保存至:" + file, Toast.LENGTH_LONG).show();resetCamera();}};// 创建resetCamera()方法,实现重新预览功能private void resetCamera() {if (!isPreview) {camera.startPreview();isPreview = true;}}@Overrideprotected void onPause() {if (camera != null) {camera.stopPreview();camera.release();}super.onPause();}
}

查看手机是否安装SD卡:

adb shell mount

adb shell df -h

手机内部存储相册路径:/storage/emulated/0/DCIM/Camera/

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><!--SurfaceView组件--><SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent" /><!--拍照按钮--><ImageButtonandroid:id="@+id/takephoto"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right|top"android:layout_marginTop="@dimen/margin_top"android:background="@color/btn_background"android:src="@drawable/camera" /><!--预览按钮--><ImageButtonandroid:id="@+id/preview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right|bottom"android:layout_marginBottom="@dimen/margin_bottom"android:background="@color/btn_background"android:src="@drawable/preview" /></FrameLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.hyh.camerapreview"><!-- 授予程序可以向SD卡中保存文件的权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 授予程序使用摄像头的权限 --><uses-permission android:name="android.permission.CAMERA"/><uses-feature android:name="android.hardware.camera.autofocus"/><uses-feature android:name="android.hardware.camera"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.CameraPreview"android:requestLegacyExternalStorage="true"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

2 遇到的问题

2.1 预览时图片拉伸

需要设置预览方向

camera.setDisplayOrientation(90);

2.2 拍照时不能保存相片

java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/1638007179710.jpg: open failed: ENOENT (No such file or directory)

android:requestLegacyExternalStorage="true"

原因是Android10弃用了管理分区外部储存

[2021.11.28]使用摄像头预览和拍照(Camera1)相关推荐

  1. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

    文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...

  2. 使用实时摄像头预览的iOS对象检测(六)

    目录 介绍 应用布局 捕获相机反馈 相机反馈预览 完成相机预览配置 结论 总目录 将ONNX对象检测模型转换为iOS Core ML(一) 解码Core ML YOLO对象检测器(二) 使用数组操作解 ...

  3. Android 前置摄像头预览与编码

    Android Camera前置摄像头采集.基于android.hardware.Camera,已经提示过时. 目标:在前置摄像头预览过程中,采集预览数据并编码到本地. 1. 设置摄像头的预览 获取摄 ...

  4. Android 短视频编辑开发之摄像头预览实时美颜(三)

    前言: 在上一篇文章中给小伙伴们介绍了进行Camera预览,如果你还没有看过的话,建议先去看上一篇文章<Android 短视频开发之摄像头预览(二> 本篇文章会介绍如何实现摄像头预览画面实 ...

  5. USB摄像头预览识别二维码

    博客: 安卓之家 掘金: jp1017 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 前言 二维码现在用的超级多,其实它就是一种编码,把字符串编码保存成一个图片,我们扫描图片得到字符串 ...

  6. 二、JAVA调用海康威视SDK实现摄像头预览完整版

    接上一章:一.JAVA调用海康威视SDK实现摄像头预览 添加摄像头信息输入框 添加视频控制按钮 添加截图功能 代码: PreView.java package com.kx.hcws;import j ...

  7. android预览摄像头,Android上的摄像头预览处理

    我正在Android上为我的机器人制作线路跟随者(学习Java/Android编程),目前我正面临图像处理问题:摄像头预览返回一个名为YUV的图像格式,I想要将其转换为阈值以便知道线路的位置,那么该怎 ...

  8. 基于camera2 untiy悬浮窗摄像头预览分析

    前言 在某机系统上 unity 导出的android 工程 使用camerax 悬浮窗口 bindToLifecycle 加上预览界面就显示不出来(手机上没问题,原因没找到),不得以 改用camera ...

  9. Android 摄像头预览悬浮窗,可拖动,可显示在其他app上方

    市面上常见的摄像头悬浮窗,如微信.手机QQ的视频通话功能,有如下特点: 整屏页面能切换到一个小的悬浮窗 悬浮窗能运行在其他app上方 悬浮窗能跳回整屏页面,并且悬浮窗消失 我们探讨过用CameraX打 ...

最新文章

  1. 受用一生的高效PyCharm使用技巧(二)
  2. hive增量表和全量表_基于 Flink + Hive 构建流批一体准实时数仓
  3. Handler消息机制(十):HandlerThread源码解析
  4. maven进行junit测试时报错(二)
  5. 委派模式与策略模式综合应用
  6. 手动安装 SAP Spartacus 3.3.0版本并启用服务器端渲染 SSR
  7. Axure原型制作规范
  8. java、sqlserver复习
  9. mysql从删库到跑路 亚马逊_Amazon RDS 上的 MySQL 的已知问题和限制 - Amazon Relational Database Service...
  10. Java多线程---线程通信(wait,notifyAll,生产者消费者经典范式,owner wait set,自定义显式锁BooleanLock)
  11. U盘制作“奶瓶”破解无线WPE\WPA\WPA2 密码教程
  12. NB-IoT 无线烟感在文物古建筑的防火安全应用
  13. 揭示:为什么别人的超级浏览器防关联有效
  14. 机器学习——逻辑回归算法代码实现
  15. 【CVPR2020】计算机视觉与模式识别会议论文完全清单_Part2
  16. 中科院博士论文《致谢》
  17. 联想服务器怎么做系统备份,联想笔记本怎么做系统备份
  18. 使用echarts扩展地图案例
  19. 详解办公室装修设计省钱妙计
  20. 在网页中插入flash的方法

热门文章

  1. @JSONField的作用
  2. 大模型 NLP 算法 大汇总
  3. c语言获取当前系统日期时间,C语言获取系统当前时间
  4. 大学校园里的十种傻学生
  5. 【100亿次的挑战】之拜年红包和春晚彩蛋
  6. Linux内存管理宏观篇(七)虚拟内存
  7. Docker进阶学习:docker-compose的体验
  8. Linux安装卸载Docker Compose
  9. Graphviz入门
  10. 确定重金属源matlab代码,关于确定表层土壤重金属污染源的研究