當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 如何獲取Android設(shè)備上的詳細(xì)的攝像頭信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置攝像頭,獲取Android攝像頭的詳細(xì)信息,在Android 2.3SDK中得到了增強(qiáng):在android

 如何獲取Android設(shè)備上的詳細(xì)的攝像頭信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置攝像頭,獲取Android攝像頭的詳細(xì)信息,在Android 2.3SDK中得到了增強(qiáng):

在android.hardware.Camera類中,API Level 9的SDK中加入了兩個(gè)比較重要的方法,使用getNumberOfCameras這個(gè)static類型方法可以獲取當(dāng)前Android設(shè)備上的攝像頭數(shù)量,比如Nexus S有兩個(gè),方法原型如下

public static int getNumberOfCameras ()

而對于具體的每個(gè)攝像頭的信息,可以通過Camera類的getCameraInfo()這個(gè)靜態(tài)方法獲取,該方法有兩個(gè)參數(shù),參數(shù)一的ID,我們通過getNumberOfCameras獲取的值減1即可,類似數(shù)組索引從0開始一樣,用循環(huán)遍歷每個(gè)攝像頭信息,參數(shù)二是android.hardware.Camera.CameraInfo類,有關(guān)getCameraInfo方法的原型如下:

public static void getCameraInfo (int cameraId, Camera.CameraInfo cameraInfo)

對于Camera.CameraInfo類而言,比較簡單,包含兩個(gè)字段

public int facing 代表攝像頭的方位,目前有定義值兩個(gè)分別為CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置

public int orientation 下面是拍照的旋轉(zhuǎn)方向,一般自然些有0度、90度、180度和270度,這樣可以獲取我們正確的手握設(shè)備是橫著還是豎著,有關(guān)拍照時(shí)的方向設(shè)置,可以參考下面的代碼設(shè)置

public static void setCameraDisplayOrientation(Activity activity,

int cameraId, android.hardware.Camera camera) {

android.hardware.Camera.CameraInfo info =

new android.hardware.Camera.CameraInfo();

android.hardware.Camera.getCameraInfo(cameraId, info);

int rotation = activity.getWindowManager().getDefaultDisplay()

.getRotation();

int degrees = 0;

switch (rotation) {

case Surface.ROTATION_0: degrees = 0; break;

case Surface.ROTATION_90: degrees = 90; break;

case Surface.ROTATION_180: degrees = 180; break;

case Surface.ROTATION_270: degrees = 270; break;

}

int result;

if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {

result = (info.orientation + degrees) % 360;

result = (360 - result) % 360; // compensate the mirror

} else { // back-facing

result = (info.orientation - degrees + 360) % 360;

}

camera.setDisplayOrientation(result);

}

使用攝像頭拍照

1. 使用 SurfaceView 控件來顯示攝像頭捕捉到的畫面

2. 具體細(xì)節(jié)

/* 獲取 SurfaceView 控件 */

SurfaceView surfaceView = (SurfaceView)this.findViewById(R.id.surfaceView);

/* 設(shè)置分辨率 */

surfaceView.getHolder().setFixedSize(176, 144);

/*下面設(shè)置Surface不維護(hù)自己的緩沖區(qū),而是等待屏幕的渲染引擎將內(nèi)容推送到用戶面前*/

surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

/* 打開攝像頭,注意這里是 android.hardware.Camera */

Camera camera = Camera.open();

/* 為 Camera 設(shè)置攝像參數(shù) */

Camera.Parameters parameters = camera.getParameters();

/* 設(shè)置預(yù)覽照片的大小,此處設(shè)置為全屏 */

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 獲取當(dāng)前屏幕管理器對象

Display display = wm.getDefaultDisplay(); // 獲取屏幕信息的描述類

parameters.setPreviewSize(display.getWidth(), display.getHeight()); // 設(shè)置

/* 每秒從攝像頭捕獲5幀畫面, */

parameters.setPreviewFrameRate(5);

/* 設(shè)置照片的輸出格式:jpg */

parameters.setPictureFormat(PixelFormat.JPEG);

/* 照片質(zhì)量 */

parameters.set("jpeg-quality", 85);

/* 設(shè)置照片的大?。捍颂幷掌笮〉扔谄聊淮笮?*/

parameters.setPictureSize(display.getWidth(), display.getHeight());

/* 將參數(shù)對象賦予到 camera 對象上 */

camera.setParameters(parameters);

/* 設(shè)置用 SurfaceView 作為承載鏡頭取景畫面的顯示 */

camera.setPreviewDisplay(surfaceView.getHolder());

/* 開始預(yù)覽 */

camera.startPreview();

/* 自動(dòng)對焦 */

camera.autoFocus(null);

/* 拍照片 */

camera.takePicture(null, null, null, jpegCallback);

/* 停止預(yù)覽 */

camera.stopPreview();

/* 釋放攝像頭 */

camera.release();

3. 添加使用攝像頭的權(quán)限

4. 測試: 目前模擬器不支持拍照環(huán)境的模擬,必須使用真實(shí)手機(jī)測試。

5. 代碼清單

** string values : strings.xml

view plaincopy to clipboardprint?

手機(jī)拍照程序

 

手機(jī)拍照程序

 

** AndroidManifest.xml

view plaincopy to clipboardprint?

[!--empirenews.page--]

package="wjh.android.takepicture"

android:versionCode="1"

android:versionName="1.0">

 

 

 

 

package="wjh.android.takepicture"

android:versionCode="1"

android:versionName="1.0">

 

 

 

 

** main.xml

view plaincopy to clipboardprint?

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="fill_parent"

/>

 

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="fill_parent"

/>

 

** MainActicity

view plaincopy to clipboardprint?

public class MainActicity extends Activity {

private Camera camera;

private boolean preview = false ;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/*

*設(shè)置窗口屬性:一定要在 setContentView(R.layout.main) 之前

*/

// 窗口標(biāo)題

requestWindowFeature(Window.FEATURE_NO_TITLE);

// 全屏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.main);

SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);

surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceView.getHolder().setFixedSize(176, 164);

surfaceView.getHolder().addCallback(new SurfaceViewCallback());

}

private final class SurfaceViewCallback implements Callback {

/**

* surfaceView 被創(chuàng)建成功后調(diào)用此方法

*/

@Override

public void surfaceCreated(SurfaceHolder holder) {

/*

* 在SurfaceView創(chuàng)建好之后 打開攝像頭

* 注意是 android.hardware.Camera

*/

camera = Camera.open();

Camera.Parameters parameters = camera.getParameters();[!--empirenews.page--]

/* 設(shè)置預(yù)覽照片的大小,此處設(shè)置為全屏 */

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 獲取當(dāng)前屏幕管理器對象

Display display = wm.getDefaultDisplay(); // 獲取屏幕信息的描述類

parameters.setPreviewSize(display.getWidth(), display.getHeight()); // 設(shè)置

/* 每秒從攝像頭捕獲5幀畫面, */

parameters.setPreviewFrameRate(5);

/* 設(shè)置照片的輸出格式:jpg */

parameters.setPictureFormat(PixelFormat.JPEG);

/* 照片質(zhì)量 */

parameters.set("jpeg-quality", 85);

/* 設(shè)置照片的大?。捍颂幷掌笮〉扔谄聊淮笮?*/

parameters.setPictureSize(display.getWidth(), display.getHeight());

/* 將參數(shù)對象賦予到 camera 對象上 */

camera.setParameters(parameters);

preview = true;

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

}

/**

* SurfaceView 被銷毀時(shí)釋放掉 攝像頭

*/

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

if(camera != null) {

/* 若攝像頭正在工作,先停止它 */

if(preview) {

camera.stopPreview();

preview = false;

}

camera.release();

}

}

}

/**

* 手機(jī)鍵盤按鍵事件

* 返回 true, 將阻止事件繼續(xù)傳遞,例如搜索鍵,他默認(rèn)會(huì)觸發(fā)和打開系統(tǒng)的搜索引擎。返回true后,將不會(huì)觸發(fā)。

*/

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

/*

* event.getRepeatCount() 為重復(fù)按鍵的次數(shù),例如,快速地對某個(gè)鍵連續(xù)按了兩次,則此值為一,表示重復(fù)了一次。往上可以累推。

* 按鍵只被按了一次,則此值為 0。

* 這有點(diǎn)類似于鼠標(biāo)的 "單擊" 和 "雙擊"。

*/

if(camera != null && event.getRepeatCount() == 0 ) {

switch (keyCode) {

case KeyEvent.KEYCODE_SEARCH: // 搜索鍵

/* 按下搜索鍵自動(dòng)對焦 , 如果要關(guān)注它的事件,

* 可以實(shí)現(xiàn) AutoFocusCallback 接口,并實(shí)例化其對象傳入 */

camera.autoFocus(null);

break;

case KeyEvent.KEYCODE_CAMERA: // 拍照鍵

case KeyEvent.KEYCODE_DPAD_CENTER: // 中間確認(rèn)鍵

/*

* @param shutter : 照片被捕獲之后的回調(diào)對象

* @param raw : 此回調(diào)對象可以生產(chǎn)為壓縮的圖片數(shù)據(jù)

* @param jpeg : 此回調(diào)對象可以產(chǎn)生壓縮后的圖片數(shù)據(jù),其onPictureTaken將被調(diào)用

*/

camera.takePicture(null, null, new TakePictureCallback());

/* 拍完照后回到預(yù)覽狀態(tài),繼續(xù)取景 -- 錯(cuò)誤的方式 */

// camera.startPreview();必須寫在 onPictureTaken 方法內(nèi)部,因?yàn)?takePicture 內(nèi)部是另開了一條線程異步的完成保存照片等操作。

// 雖然 takePicture 方法完成了,但是并不代表其內(nèi)部的工作全部完成,也不代表攝像頭以及從上一次“拍照”任務(wù)中工作完畢

break;

default:

break;

}

return true;

}

return super.onKeyDown(keyCode, event);

}

/**

* 處理照片被拍攝之后的事件

*/

private final class TakePictureCallback implements PictureCallback {

@Override

public void onPictureTaken(byte[] data, Camera camera) {

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

/* 照片將被保存到 SD 卡跟目錄下,文件名為系統(tǒng)時(shí)間,后綴名為".jpg" */

File file = new File(Environment.getExternalStorageState(), System.currentTimeMillis() + ".jpg");

try {

FileOutputStream fos = new FileOutputStream(file);

/* 位圖格式為JPEG

* 參數(shù)二位 0-100 的數(shù)值,100為最大值,表示無損壓縮

* 參數(shù)三傳入一個(gè)輸出流對象,將圖片數(shù)據(jù)輸出到流中

*/

bitmap.compress(CompressFormat.JPEG, 100, fos);

fos.close();

/* 拍完照后回到預(yù)覽狀態(tài),繼續(xù)取景 */

camera.startPreview();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉