當前位置:首頁 » 安卓系統 » 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層的回調函數中。

熱點內容
asp連接遠程資料庫 發布:2025-05-20 10:50:20 瀏覽:388
一般電腦配置哪個好 發布:2025-05-20 10:40:58 瀏覽:602
我的世界擼樹伺服器 發布:2025-05-20 10:33:37 瀏覽:740
ftp搭建win7 發布:2025-05-20 10:06:06 瀏覽:82
訪問堅果 發布:2025-05-20 10:06:02 瀏覽:394
ftpxlight 發布:2025-05-20 10:05:22 瀏覽:111
java的實驗報告 發布:2025-05-20 10:02:06 瀏覽:528
豪華配置高電動轎車有哪些 發布:2025-05-20 10:01:59 瀏覽:487
哪些電腦配置低 發布:2025-05-20 09:34:16 瀏覽:955
地板網站源碼 發布:2025-05-20 09:27:23 瀏覽:346