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

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(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 ()

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

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

對(duì)于Camera.CameraInfo類而言,比較簡(jiǎn)單,包含兩個(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 控件來(lái)顯示攝像頭捕捉到的畫(huà)面

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

/* 打開(kāi)攝像頭,注意這里是 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)前屏幕管理器對(duì)象

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

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

/* 每秒從攝像頭捕獲5幀畫(huà)面, */

parameters.setPreviewFrameRate(5);

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

parameters.setPictureFormat(PixelFormat.JPEG);

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

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

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

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

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

camera.setParameters(parameters);

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

camera.setPreviewDisplay(surfaceView.getHolder());

/* 開(kāi)始預(yù)覽 */

camera.startPreview();

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

camera.autoFocus(null);

/* 拍照片 */

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

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

camera.stopPreview();

/* 釋放攝像頭 */

camera.release();

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

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

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)建好之后 打開(kāi)攝像頭

* 注意是 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)前屏幕管理器對(duì)象

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

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

/* 每秒從攝像頭捕獲5幀畫(huà)面, */

parameters.setPreviewFrameRate(5);

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

parameters.setPictureFormat(PixelFormat.JPEG);

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

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

/* 設(shè)置照片的大小:此處照片大小等于屏幕大小 */

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

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

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ī)鍵盤(pán)按鍵事件

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

*/

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

/*

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

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

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

*/

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

switch (keyCode) {

case KeyEvent.KEYCODE_SEARCH: // 搜索鍵

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

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

camera.autoFocus(null);

break;

case KeyEvent.KEYCODE_CAMERA: // 拍照鍵

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

/*

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

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

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

*/

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

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

// camera.startPreview();必須寫(xiě)在 onPictureTaken 方法內(nèi)部,因?yàn)?takePicture 內(nèi)部是另開(kā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為最大值,表示無(wú)損壓縮

* 參數(shù)三傳入一個(gè)輸出流對(duì)象,將圖片數(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)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉