www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

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

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

public static int getNumberOfCameras ()

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

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

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

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

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

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. 具體細節(jié)

/* 獲取 SurfaceView 控件 */

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

/* 設置分辨率 */

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

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

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

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

Camera camera = Camera.open();

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

Camera.Parameters parameters = camera.getParameters();

/* 設置預覽照片的大小,此處設置為全屏 */

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

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

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

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

parameters.setPreviewFrameRate(5);

/* 設置照片的輸出格式:jpg */

parameters.setPictureFormat(PixelFormat.JPEG);

/* 照片質量 */

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

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

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

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

camera.setParameters(parameters);

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

camera.setPreviewDisplay(surfaceView.getHolder());

/* 開始預覽 */

camera.startPreview();

/* 自動對焦 */

camera.autoFocus(null);

/* 拍照片 */

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

/* 停止預覽 */

camera.stopPreview();

/* 釋放攝像頭 */

camera.release();

3. 添加使用攝像頭的權限

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

5. 代碼清單

** string values : strings.xml

view plaincopy to clipboardprint?

手機拍照程序

 

手機拍照程序

 

** 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);

/*

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

*/

// 窗口標題

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)建成功后調用此方法

*/

@Override

public void surfaceCreated(SurfaceHolder holder) {

/*

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

* 注意是 android.hardware.Camera

*/

camera = Camera.open();

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

/* 設置預覽照片的大小,此處設置為全屏 */

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

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

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

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

parameters.setPreviewFrameRate(5);

/* 設置照片的輸出格式:jpg */

parameters.setPictureFormat(PixelFormat.JPEG);

/* 照片質量 */

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

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

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 被銷毀時釋放掉 攝像頭

*/

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

if(camera != null) {

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

if(preview) {

camera.stopPreview();

preview = false;

}

camera.release();

}

}

}

/**

* 手機鍵盤按鍵事件

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

*/

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

/*

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

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

* 這有點類似于鼠標的 "單擊" 和 "雙擊"。

*/

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

switch (keyCode) {

case KeyEvent.KEYCODE_SEARCH: // 搜索鍵

/* 按下搜索鍵自動對焦 , 如果要關注它的事件,

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

camera.autoFocus(null);

break;

case KeyEvent.KEYCODE_CAMERA: // 拍照鍵

case KeyEvent.KEYCODE_DPAD_CENTER: // 中間確認鍵

/*

* @param shutter : 照片被捕獲之后的回調對象

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

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

*/

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

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

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

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

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)時間,后綴名為".jpg" */

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

try {

FileOutputStream fos = new FileOutputStream(file);

/* 位圖格式為JPEG

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

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

*/

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

fos.close();

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

camera.startPreview();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

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

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

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

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

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

關鍵字: 汽車 人工智能 智能驅動 BSP

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

關鍵字: 亞馬遜 解密 控制平面 BSP

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

關鍵字: 騰訊 編碼器 CPU

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

關鍵字: 華為 12nm EDA 半導體

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

關鍵字: 華為 12nm 手機 衛(wèi)星通信

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

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

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

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

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

關鍵字: BSP 信息技術
關閉
關閉