当前位置:首页 » 安卓系统 » androidcamera分析

androidcamera分析

发布时间: 2023-01-19 06:42:06

① Android camera重要问题

  1. 首先显示的图片应该设置为wrap_content,

  2. 然后使用系统相机拍照时执行下面这段代码就行了,最简单的方式


//使用意图直接调用照相机

Intentintent=newIntent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

//打开照相机,设置请求码

startActivityForResult(intent,OPEN_RESULT);

② Android camera 问题

代码 没贴出来。只知道你是报空置。

③ android Camera 如何判断当前使用的摄像头是前置还是后置

可以通过:
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
判断使用是前置还是后置摄像头,可以通过if (info.facing == CameraInfo.CAMERA_FACING_FRONT) 来判断
如果是已经打开的camera实例的话,可以通过
CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
if(mCameraId == CameraInfo.CAMERA_FACING_FRONT) 来判断

④ Android中Camera方向问题总结

          如今生活当中每一个人都离不开手机,拍摄照片更加常见,刚好最近在研究Android中的Camera的“方向”问题,总结一下。好了,进入正题,通过手机的Camera拍摄出来的照片来自于相机的图像传感器,相机被固定到手机后,相机的图像传感器的图像采集方向就固定住了,因此相机传感器的采集图像的方向我们是改变不了,只能对采集后获得的图片数据进行旋转,以便得到正确的预览。我们可以通过CameraInfo对象的orientation属性来获取图像传感器的图像采集方向,orientation属性就描述着相机的图像传感器采集图像的方向,orientation是一个角度值,只能是0,90,180,270四个中的一个,表示的含义就是图像传感器采集图像的角度,忘记说了,这里的角度是相对于手机的“自然方向”来说的,何为“自然方向”?是指当宽比高短时,我们看到的手机的方向(竖屏),可以这样理解,这个值是相机所采集的图片需要顺时针旋转至自然方向的角度值,因为如果我们要想在手机的自然方向上正确预览相机拍照的图片数据,我们必须对相机传感器采集的图像进行顺时针旋转,这个旋转的角度就是orientation,注意只能对拍照后获得的图片数据进行旋转,我们是无法改变相机传感器采集图像的方向的,因为它在相机被固定到手机上后,就被固定死了。 

             图像传感器的预览方向默认情况下是和图像传感器的图像采集方向是一致,也就是前面提到的orientation值,那这里为什么说默认呢?是因为相机传感器的预览方向是可以改变的,不像图像传感器的图像采集方向无法改变,通过Camera对象的setDisplayOrientation方法改变预览方向(顺时针旋转)。对大部分手机来说,后置摄像头的orientation为90,也就是说我们需要对拍照采集的图片数据顺时针旋转90度,才能够在自然方向正确预览我们拍摄后的图片,需要通过Camera对象的setDisplayOrientation顺时针旋转90度才能在自然方向正确预览我们的摄像头画面。同样对于大部分手机来说,前置摄像头的orientation通常为270度,也就是说我们需要对拍照采集的图片数据顺时针旋转270度,才能够在自然方向正确预览我们拍摄后的图片,但是我们预览方向我们却不是顺时针旋转270度,而是90度,这是为什么呢?因为前者摄像头会在旋转预览方向之前,会对预览方向来一个水平的镜像翻转,这就是为什么我们通过前者摄像头像是在照镜子一般,可能还不太理解,我们会通过图片来对上面的分析进行演示。 

后置摄像头orientation=90,此时图像传感器采集图像的方向90度,相对于自然方向,如下:

此时图像采集的方向我们是无法改变的,但是能够改变预览的方向,通过setDisplayOrientation(90)顺时针旋转预览方向,以便在自然方向进行正确预览。

我们来看看前置摄像头orientation=270的情况,铭记前置摄像头预览方向在旋转之前会进行一个水平镜像翻转(可以理解为逆时针旋转180),这就是为什么我们通过手机前置摄像头预览时,看到的像是在照镜子一般。

此时我们需要将获取到的图片数据进行顺时针旋转270度,才能够在手机自然方向正确预览。接下来看看前者摄像头预览方向,注意咯

好了,就到这,水平有限,有什么错误的地方,希望各位大神留言,拜托了。

⑤ Android Camera(二)

CameraManager、CameraDevice、CameraCharacteristics、CameraRequest与CameraRequest.Builder、CameraCaptureSession以及CaptureResult。

1. 开发相机必须的的权限就是 Manifest.permission.CAMERA 了,所以第一步要在Manifest中添加Camera permission:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" /></pre>

如果是6.0以上的手机还要动态申请权限,关于权限这块大家可以使用PermissionUtil全局管理。

2.获取CameraManager实例 开启相机

3.当相机成功打开后会回调onOpened方法,这里可以拿到CameraDevice对象,也就是具体的摄像头设备

4.设置相机一些参数 包括方向

5.开启预览

6.开启预览后获取实时流数据,onImageAvailable回调中的ImageRender获取实时流数据,这个数据是YUV_420_888的数据 ,我们可以存储数据也可以对数据流进行美颜滤镜操作,也可以推送给服务端。

7.当关闭界面或者停止预览时 :

⑥ Android Camera2 教程 · 第一章 · 概览

从 Android 5.0 开始,Google 引入了一套全新的相机框架 Camera2(android.hardware.camera2)并且废弃了旧的相机框架 Camera1(android.hardware.Camera)。作为一个专门从事相机应用开发的开发者来说,这一刻我等了太久了,Camera1 那寥寥无几的 API 和极差的灵活性早已不能满足日益复杂的相机功能开发。Camera2 的出现给相机应用程序带来了巨大的变革,因为它的目的是为了给应用层提供更多的相机控制权限,从而构建出更高质量的相机应用程序。本文是 Camera2 教程的开篇作,本章将介绍以下几个内容:

Camera2 的 API 模型被设计成一个 Pipeline(管道),它按顺序处理每一帧的请求并返回请求结果给客户端。下面这张来自官方的图展示了 Pipeline 的工作流程,我们会通过一个简单的例子详细解释这张图。

为了解释上面的示意图,假设我们想要同时拍摄两张不同尺寸的图片,并且在拍摄的过程中闪光灯必须亮起来。整个拍摄流程如下:

一个新的 CaptureRequest 会被放入一个被称作 Pending Request Queue 的队列中等待被执行,当 In-Flight Capture Queue 队列空闲的时候就会从 Pending Request Queue 获取若干个待处理的 CaptureRequest,并且根据每一个 CaptureRequest 的配置进行 Capture 操作。最后我们从不同尺寸的 Surface 中获取图片数据并且还会得到一个包含了很多与本次拍照相关的信息的 CaptureResult,流程结束。

相机功能的强大与否和硬件息息相关,不同厂商对 Camera2 的支持程度也不同,所以 Camera2 定义了一个叫做 Supported Hardware Level 的重要概念,其作用是将不同设备上的 Camera2 根据功能的支持情况划分成多个不同级别以便开发者能够大概了解当前设备上 Camera2 的支持情况。截止到 Android P 为止,从低到高一共有 LEGACY、LIMITED、FULL 和 LEVEL_3 四个级别:

相机的所有操作和参数配置最终都是服务于图像捕获,例如对焦是为了让某一个区域的图像更加清晰,调节曝光补偿是为了调节图像的亮度。因此,在 Camera2 里面所有的相机操作和参数配置都被抽象成 Capture(捕获),所以不要简单的把 Capture 直接理解成是拍照,因为 Capture 操作可能仅仅是为了让预览画面更清晰而进行对焦而已。如果你熟悉 Camera1,那你可能会问 setFlashMode() 在哪? setFocusMode() 在哪? takePicture() 在哪?告诉你,它们都是通过 Capture 来实现的。

Capture 从执行方式上又被细分为【单次模式】、【多次模式】和【重复模式】三种,我们来一一解释下:

CameraManager 是一个负责查询和建立相机连接的系统服务,它的功能不多,这里列出几个 CameraManager 的关键功能:

CameraCharacteristics 是一个只读的相机信息提供者,其内部携带大量的相机信息,包括代表相机朝向的 LENS_FACING ;判断闪光灯是否可用的 FLASH_INFO_AVAILABLE ;获取所有可用 AE 模式的 CONTROL_AE_AVAILABLE_MODES 等等。如果你对 Camera1 比较熟悉,那么 CameraCharacteristics 有点像 Camera1 的 Camera.CameraInfo 或者 Camera.Parameters 。

CameraDevice 代表当前连接的相机设备,它的职责有以下四个:

熟悉 Camera1 的人可能会说 CameraDevice 就是 Camera1 的 Camera 类,实则不是,Camera 类几乎负责了所有相机的操作,而 CameraDevice 的功能则十分的单一,就是只负责建立相机连接的事务,而更加细化的相机操作则交给了稍后会介绍的 CameraCaptureSession。

Surface 是一块用于填充图像数据的内存空间,例如你可以使用 SurfaceView 的 Surface 接收每一帧预览数据用于显示预览画面,也可以使用 ImageReader 的 Surface 接收 JPEG 或 YUV 数据。每一个 Surface 都可以有自己的尺寸和数据格式,你可以从 CameraCharacteristics 获取某一个数据格式支持的尺寸列表。

CameraCaptureSession 实际上就是配置了目标 Surface 的 Pipeline 实例,我们在使用相机功能之前必须先创建 CameraCaptureSession 实例。一个 CameraDevice 一次只能开启一个 CameraCaptureSession,绝大部分的相机操作都是通过向 CameraCaptureSession 提交一个 Capture 请求实现的,例如拍照、连拍、设置闪光灯模式、触摸对焦、显示预览画面等等。

CaptureRequest 是向 CameraCaptureSession 提交 Capture 请求时的信息载体,其内部包括了本次 Capture 的参数配置和接收图像数据的 Surface。CaptureRequest 可以配置的信息非常多,包括图像格式、图像分辨率、传感器控制、闪光灯控制、3A 控制等等,可以说绝大部分的相机参数都是通过 CaptureRequest 配置的。值得注意的是每一个 CaptureRequest 表示一帧画面的操作,这意味着你可以精确控制每一帧的 Capture 操作。

CaptureResult 是每一次 Capture 操作的结果,里面包括了很多状态信息,包括闪光灯状态、对焦状态、时间戳等等。例如你可以在拍照完成的时候,通过 CaptureResult 获取本次拍照时的对焦状态和时间戳。需要注意的是,CaptureResult 并不包含任何图像数据,前面我们在介绍 Surface 的时候说了,图像数据都是从 Surface 获取的。

如果要我给出强有力的理由解释为什么要使用 Camera2,那么通过 Camera2 提供的高级特性可以构建出更加高质量的相机应用程序应该是最佳理由了。

如果你熟悉 Camera1,并且打算从 Camera1 迁移到 Camera2 的话,希望以下几个建议可以对你起到帮助:

本章到此结束,主要是介绍了 Camera2 的一些基础概念,让大家能够基本了解 Camera2 的工作流程和基础概念,并且知道使用 Camera2 能够做些什么。如果你对 Camera2 还是感到很陌生,不要紧,后续的教程会带领大家逐步深入了解 Camera2。

⑦ Media Mole之Camera(四) 拍照 底层分析

下面主要介绍拍照流程的底层实现。

当指定了Camera的预览类,并开始预览之后,就可以通过takePicture()方法进行拍照了。它将以异步的方式从Camera中获取图像,具有多个回调类作为参数,并且都可以为null,下面分别介绍这些参数的意义:
• shutter:在按下快门的时候回调,这里可以播放一段声音。
• raw:从Camera获取到未经处理的图像。
• postview:从Camera获取一个快速预览的图片,不是所有设备都支持。
• jpeg:从Camera获取到一个经过压缩的jpeg图片。
虽然raw、postview、jpeg都是Camera.PictureCallback回调,但是一般我们只需要获取jpeg,其他传null即可,Camera.PictureCallback里需要实现一个方法onPictureTaken(byte[] data,Camera camera),data及为图像数据。值得注意的是,一般taskPicture()方法拍照完成之后,SurfaceView都会停留在拍照的瞬间,需要重新调用startPreview()才会继续预览。
如果直接使用taskPicture()进行拍照的话,Camera是不会进行自动对焦的,这里需要使用Camera.autoFocus()方法进行对焦,它传递一个Camera.AutoFocusCallback参数,用于自动对焦完成后回调,一般会在它对焦完成在进行taskPicture()拍照。

首先拍照的流程直接从Camera.java的takePicture开始分析。

可以看出,在方法中对各种回调的值进行了赋值,继续看底层对调函数的处理。

在应用层注册回调。
packages\apps\SnapdragonCamera\src\com\android\camera\AndroidCameraManagerImpl.java

在应用层实现回调。

这里就是真正存储数据的地方了,在android系统有四个地方可以存储共同数据区,
ContentProvider,sharedpreference、file、sqlite这几种方式,这里利用的是file方式。

然后调用到JNI层相应方法。

根据之前分析的binder机制,Camera.cpp -> ICamera.cpp -> CameraClient.cpp(server端)

此处的takepicture是在CameraHardwareInterface.h定义的方法。

frameworks/av/services/camera/libcameraservice/device1/CameraHardwareInterface.h

在CameraClient.cpp开始调用到HAL层中进行处理,接下来主要分析在

hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp得具体实现。

在此方法中去更新状态机的状态。

hardware/qcom/camera/QCamera2/HAL/QCameraStateMachine.cpp

首先调用回QCamera2HWI.cpp的prepareHardwareForSnapshot方法。

接着调用到mm_camera_interface.c的mm_camera_intf_prepare_snapshot方法。

hardware/qcom/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_interface.c

接着调用mm_camera.c的mm_camera_prepare_snapshot方法,去与V4L2通信,准备拍照。

hardware/qcom/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c

当底层对拍照准备完成之后,会调用到QCamera2HWICallbacks.cpp里,处理metadata

数据的方法metadata_stream_cb_routine中。

hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp

之后返回到QCamera2HWI.cpp类里的take_picture方法,继续下面的操作。

此处又返回到QCamera2HWI.cpp类里的takePicture()方法中。

首先先停止并删除了preview的channel,然后调用addCaptureChannel()方法。

可以看出,在此方法中创建并初始化了channel,并且添加mediadata,postview,snapshot数据流到channel中。

返回到hardware/qcom/camera/QCamera2/HAL/QCamera2HWI.cpp的takePicture()方法中,继续调用到开启capture的channel。

channel的start方法在之前的preview流程中具体介绍过,在此不做分析。

之后又调用了QCameraChannel.cpp的startAdvancedCapture方法,然后是mm-camera-interface.c的process_advanced_capture方法,然后是mm-camera.c的mm_camera_channel_advanced_capture方法,这一系列方法设置了当前管道是拍照模式。

通过mm-jpeg-interface.c处理数据流,并且生成jpeg文件,然后在QCamera2HWI.cpp中处理从mm-jpeg-interface.c发出的jpeg相关事件。

此处更改了状态机的状态。

然后调用回QCamera2HWI.cpp的processJpegNotify方法

此处调用的是QCameraPostProc.cpp的processJpegEvt方法。

hardware/qcom/camera/QCamera2/HAL/QCameraPostProc.cpp

接着调用sendDataNotify方法。

可以看出此处在给回调的对象装填数据,并且发出通知notifyCallback回调。并且,类型为CAMERA_MSG_COMPRESSED_IMAGE。

之后的流程与preview的流程相似,将数据向上层抛送,通过JNI返回到java层的回调函数中。

热点内容
万胜压缩机价格 发布:2025-05-20 12:20:00 浏览:987
判断云服务器是否诚实的存放数据 发布:2025-05-20 12:11:07 浏览:376
c语言基础书 发布:2025-05-20 12:11:00 浏览:780
java小数正则表达式 发布:2025-05-20 11:30:58 浏览:136
文件夹加密win7 发布:2025-05-20 11:27:46 浏览:837
压缩文件设置密码有什么意思 发布:2025-05-20 11:26:37 浏览:551
造梦西游qq登录如何修改密码 发布:2025-05-20 11:18:36 浏览:382
淘宝缓存清理后还是大 发布:2025-05-20 11:15:39 浏览:149
ios云存储自动订购 发布:2025-05-20 11:06:22 浏览:110
编程与数学 发布:2025-05-20 11:01:23 浏览:444