新聞中心
android如何獲取相機(jī)分辨率?
安卓系統(tǒng)在獲取相機(jī)分辨率時(shí),可以參考SDK中的API,獲取相機(jī)的參數(shù):
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供婺城網(wǎng)站建設(shè)、婺城做網(wǎng)站、婺城網(wǎng)站設(shè)計(jì)、婺城網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、婺城企業(yè)網(wǎng)站模板建站服務(wù),10年婺城做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
Camera.Parameters parameters = camera.getParameters();
獲取預(yù)覽的各種分辨率:
ListSize supportedPreviewSizes = parameters.getSupportedPreviewSizes();
獲取攝像頭支持的各種分辨率:
ListSize supportedPictureSizes = parameters.getSupportedPictureSizes();
例如:獲取照相機(jī)參數(shù),設(shè)置需要的參數(shù),其余缺省
Camera camera = Camera.open(); ? ? ? ? ?
Camera.Parameters parameters = camera.getParameters();
設(shè)置照片格式:
parameters.setPictureFormat(PixelFormat.JPEG);
設(shè)置預(yù)瀏尺寸,注意要在攝像頭支持的范圍內(nèi)選擇:
parameters.setPreviewSize(WIDTH, HEIGHT);
設(shè)置照片分辨率,注意要在攝像頭支持的范圍內(nèi)選擇
parameters.setPictureSize(WIDTH, HEIGHT);
設(shè)置照相機(jī)參數(shù):
camera.setParameters(parameters);
開(kāi)始拍照:
camera.startPreview();
以上就是獲取相機(jī)分辨率的步驟。
Android是一種基于Linux的自由及開(kāi)放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由Google公司和開(kāi)放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開(kāi)發(fā)。尚未有統(tǒng)一中文名稱,中國(guó)大陸地區(qū)較多人使用“安卓”或“安致”。
Android 使用系統(tǒng)相機(jī)拍照和讀取相冊(cè)照片
1.拍照 (對(duì)于7.0以上的版本,不在允許直接訪問(wèn)uri)
`
若不指定輸出路徑intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri(srcActivity)); 在onActivityResult()中,通過(guò)
`
可以拿到uri,但獲得的圖片是被壓縮過(guò)的。若指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);輸出路徑,則此處的intent為null,但可以使用我們存的uri讀取照片,此時(shí)的照片沒(méi)有被壓縮。
2.從相冊(cè)中讀取照片, 方法:
`
`
即使設(shè)置 intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri(srcActivity));輸出路徑,仍然不能從此路徑中讀取,只能在onActivityForResult()中通過(guò)event.uri = intent.getData();方式獲得圖片uri。
此種現(xiàn)象也好理解,拍照時(shí)產(chǎn)生新的圖片,自然可根據(jù)設(shè)置的uri進(jìn)行圖片保存,而讀取相冊(cè)時(shí),圖片已經(jīng)在目錄中不能轉(zhuǎn)移到自己設(shè)定的uri中。
Androidmanifest.xml中
`
在 res/xml/provider_paths.xml
`
?xml version="1.0" encoding="utf-8"?
paths
external-path name="JDTobs" path=""/
files-path name="name" path="path" /
cache-path name="name" path="path" / external-path name="name" path="path" /
external-files-path name="name" path="path" /
external-cache-path name="name" path="path" / /paths `
讀取uri
Android 系統(tǒng)原生相機(jī)API角度原理與適配
雖然Camera作為第一代原生android所提供的相機(jī)類一直被開(kāi)發(fā)者甚至Google官方開(kāi)發(fā)人員所詬病,但為了兼容和適配Android版本5.0以下的App應(yīng)用,我們別無(wú)選擇。因此,有了本篇文檔詳細(xì)闡述1.0版的Camera 是如何使用的。本篇使用的是SurfaceView與Camera類。
文檔下文會(huì)在拍照流程中的不同的階段應(yīng)用到上述四個(gè)角度,而“終端自然方向”貫穿整個(gè)流程當(dāng)中。這一個(gè)方向、四個(gè)角度非常重要,缺一不可,是支撐相機(jī)Camera 系列API的關(guān)鍵。在設(shè)計(jì)NXDesign的相機(jī)項(xiàng)目中,經(jīng)過(guò)對(duì)官方文檔的研讀和各路資料的調(diào)研之后發(fā)現(xiàn),我們?cè)诰W(wǎng)絡(luò)上查到的博客類相關(guān)資料有80%的實(shí)現(xiàn)方式是存在問(wèn)題的,當(dāng)然,這也可以歸咎于該API其本身確實(shí)不好用,如果不對(duì)源碼注釋進(jìn)行仔細(xì)研究,很容易對(duì)開(kāi)發(fā)者產(chǎn)生誤導(dǎo)。
更加準(zhǔn)確的說(shuō),相機(jī)的生命周期是依托于SurfaceView的創(chuàng)建和銷毀來(lái)完成的。SurfaceView的作用是提供相機(jī)內(nèi)容的實(shí)時(shí)預(yù)覽。我們需要在surfaceview創(chuàng)建好之后打開(kāi)相機(jī)使用相機(jī)資源,在surfaceview被銷毀后釋放相機(jī)資源。
surfaceview 提供了holder機(jī)制向調(diào)用方通知surfaceview的變化時(shí)機(jī),為了在不同的時(shí)機(jī)對(duì)相機(jī)資源做不同的事情,需要調(diào)用SurfaceHolder.addCallback()方法。
現(xiàn)在的Android手機(jī)一般會(huì)有多個(gè)攝像頭,但根據(jù)其方向可以歸為兩類: CAMERA_FACING_BACK 和 CAMERA_FACING_FRONT 。在打開(kāi)攝像頭之前,首先需要獲取相機(jī)資源,判斷相機(jī)個(gè)數(shù) Camera.getNumberOfCameras() 。每個(gè)相機(jī)對(duì)應(yīng)一個(gè)CameraInfo,它的定義如下:
這里涉及到一個(gè)重要概念:相機(jī)圖像傳感器(camera sensor),想要理解上述注釋的含義,就需要先理解下圖內(nèi)容。
左圖是通常情況下,我們對(duì)view的x y方向的認(rèn)知,以屏幕的左上角為原點(diǎn)向右為x正方向,向下為y正方向;但是,右圖描述的是絕大多數(shù)情況下, 相機(jī)圖像傳感器 的起始位置和方向判定。與view不同的是,傳感器以手機(jī)屏幕在自然方向上的右上角為原點(diǎn),向下為x正方向,向左為y正方向。因此,我們理解上述注釋就不難了。如果相機(jī)自帶的傳感器頂部與終端自然方向(手機(jī)屏幕的硬件方向,一般手機(jī)都是豎直方向,也就是文檔中說(shuō)的naturally tall screen)的右邊緣一致,則這個(gè)值就是90度。如果前置攝像頭傳感器的頂部與手機(jī)自然方向一致,則這個(gè)值就是270度。
當(dāng)我們定義startCamera()方法時(shí),要做5件事情,1.遍歷攝像頭cameraId,找到想要打開(kāi)的攝像頭(前置還是后置);2.獲取攝像頭信息,主要獲取orientation;3. 設(shè)置相機(jī)DisplayOrientation 4.設(shè)置相機(jī)參數(shù),主要是寬高比、對(duì)焦模式、圖片格式、setRotation等。5. 向camera設(shè)置surfaceview.viewholder,并且startPreview。主要邏輯如下:
拿到cameraInfo.orientation之后,要調(diào)用camera.setDisplayOrientation設(shè)置進(jìn)去,保證通過(guò)surfaceview預(yù)覽到的取景跟當(dāng)前的手機(jī)方向保持一致,但是,setDisplayOrientation設(shè)置的其實(shí)是經(jīng)過(guò)兩個(gè)角度計(jì)算之后的復(fù)合角度,而并不單純是cameraInfo.orientation。正確的做法是這樣的:先獲取手機(jī)屏幕的旋轉(zhuǎn)方向,然后與cameraInfo.orientation加和得到最終角度。通常情況下,如果我們?cè)O(shè)置相機(jī)為portrait,則不用考慮rotation。這也是為什么絕大部分網(wǎng)絡(luò)資料中都會(huì)粗暴的寫(xiě)入一個(gè)90度完事兒而并沒(méi)有解釋這么做的道理。
調(diào)用camera.takePicture(null, null, pictureCallback)
這里需要做的僅僅是將callback中返回的data存儲(chǔ)為File。需要注意的是,data中會(huì)包含setRotation()方法中的角度信息,因此如果直接使用Bitmap工具類生成bitmap,再進(jìn)行存儲(chǔ)或者展示,生成出來(lái)的圖像其實(shí)是缺失了旋轉(zhuǎn)角度的原始方向,這十有八九會(huì)發(fā)生圖像展示角度錯(cuò)誤的情況。因此,需要直接保存,再通過(guò)Exif工具類讀取File中的角度信息(當(dāng)然Exif工具類就是為了讀取File中的各種信息而生的,比如拍照時(shí)間、經(jīng)緯度等等)。
基于Camera API,
surfaceview的預(yù)覽需要setDisplayOrientation(),入?yún)⒔嵌扰cCameraInfo.orientation(傳感器偏角)和WindowManager.default.displayOrientation(屏幕旋轉(zhuǎn)角度)兩個(gè)角度有關(guān)。
相機(jī)拍照前需要setRotation(),入?yún)⒔嵌扰cCameraInfo.orientation(傳感器偏角)和OrientationEventListener返回的orientation(終端自然角度偏角)有關(guān),二者的換算結(jié)果就是圖像寫(xiě)入偏角,該偏角意味著圖像被順時(shí)針旋轉(zhuǎn)該角度就能夠回正展示。
Android調(diào)用系統(tǒng)相機(jī)實(shí)現(xiàn)拍照和視頻錄制
(1)申請(qǐng)權(quán)限
(2)設(shè)置布局
這里做了一個(gè)簡(jiǎn)單的布局:添加了一個(gè)按鈕和一個(gè)ImageView控件用于顯示拍攝的圖像。
(3)為按鈕添加點(diǎn)擊事件監(jiān)聽(tīng)
點(diǎn)擊按鈕時(shí),調(diào)用系統(tǒng)相機(jī)進(jìn)行拍照,并在確定后將圖像顯示在ImageView控件中。
(1)申請(qǐng)權(quán)限
(2)設(shè)置布局
添加了一個(gè)按鈕和一個(gè)VideoView控件用于顯示錄制的視頻。
(3)為按鈕添加點(diǎn)擊事件監(jiān)聽(tīng)
同前面一樣,點(diǎn)擊按鈕后調(diào)用系統(tǒng)相機(jī)進(jìn)行錄制視頻,錄制完成后點(diǎn)擊確定即可將錄制的視頻顯示在VideoView控件中。
對(duì)于Android11.0的版本,在調(diào)用系統(tǒng)相近進(jìn)行視頻錄制的時(shí)候,即使在AndroidMenifest.xml中申請(qǐng)了CAMERA權(quán)限,還是會(huì)在程序運(yùn)行時(shí)報(bào)錯(cuò): Permission? Denial , ? . .... ....? with revoked permission android.permission.CAMERA
解決方法是在程序中動(dòng)態(tài)申請(qǐng)權(quán)限:
寫(xiě)在最后:文章是在學(xué)習(xí)過(guò)程中做的學(xué)習(xí)筆記,同時(shí)與志同道合者分享,文章內(nèi)容均經(jīng)過(guò)我自己實(shí)驗(yàn)證實(shí)可行,如有問(wèn)題歡迎留言,很高興一起交流討論,共同進(jìn)步!
新聞名稱:相機(jī)android,相機(jī)英文
轉(zhuǎn)載來(lái)源:http://www.dlmjj.cn/article/phjdhs.html