1、首先繼承surfaceview并實作surfaceholder.callback接口
使用接口的原因:因為使用surfaceview 有一個原則,所有的繪圖工作必須得在surface 被建立之後才能開始(surface—表面,這個概念在 圖形程式設計中常常被提到。基本上我們可以把它當作顯存的一個映射,寫入到surface 的内容
可以被直接複制到顯存進而顯示出來,這使得顯示速度會非常快),而在surface 被銷毀之前必須結束。是以callback 中的surfacecreated 和surfacedestroyed 就成了繪圖處理代碼的邊界。
而我們在調用camera也是在他的oncreate()方法裡
/**
* surfaceview 被建立成功後調用此方法
*/
@override
public void surfacecreated(surfaceholder holder) {
/*
* 在surfaceview建立好之後 打開攝像頭
* 注意是 android.hardware.camera
*/
camera = camera.open(cameraposition); //預設啟用的攝像頭是後置攝像頭id=0, id =1前置攝像頭
try {
camera.setpreviewdisplay(holder); //這句是用來設定顯示的,不調用的話沒有圖像
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
camera.parameters parameters = camera.getparameters(); //擷取他的熟悉來進行設定
setcameradisplayorientation(mainacticity.this, cameraposition, camera); //進行旋轉,因為攝像頭預設的
//不是顯示是橫向的,可以删掉這一行看看效果
/* 設定預覽照片的大小,此處設定為全屏 */
windowmanager wm = (windowmanager) getsystemservice(context.window_service); // 擷取目前螢幕管理器對象
display display = wm.getdefaultdisplay(); // 擷取螢幕資訊的描述類
// parameters.setpreviewsize(display.getwidth(), display.getheight());
// parameters.setpicturesize(display.getwidth(), display.getheight());// 如果是定制機或是進行過深度測試的不需要設定這倆個屬性
/* 每秒從攝像頭捕獲5幀畫面, */
parameters.setpreviewframerate(5);
/* 設定照片的輸出格式:jpg */
parameters.setpictureformat(pixelformat.jpeg);
/* 照片品質 */
parameters.set("jpeg-quality", 85);
/* 設定照片的大小:此處照片大小等于螢幕大小 */
/* 将參數對象賦予到 camera 對象上 */
camera.setparameters(parameters);
camera.startpreview();
preview = true;
}
2、當被銷毀的時候要關閉攝像頭
/**
* surfaceview 被銷毀時釋放掉 攝像頭
public void surfacedestroyed(surfaceholder holder) {
if(camera != null) {
/* 若攝像頭正在工作,先停止它 */
if(preview) {
camera.stoppreview();
preview = false;
}
camera.release();
}
3、切換攝像頭是通過配置他的參數來設定camera.open(i); i就是要打開的攝像頭id;
// todo auto-generated method stub
int cameracount = 0;
camerainfo camerainfo = new camerainfo();
cameracount = camera.getnumberofcameras();//得到攝像頭的個數
for(int i = 0; i < cameracount; i ++ ) {
camera.getcamerainfo(i, camerainfo);//得到每一個攝像頭的資訊
if(cameraposition == 1) {
//現在是後置,變更為前置
if(camerainfo.facing == camera.camerainfo.camera_facing_front) {//代表攝像頭的方位,camera_facing_front前置 camera_facing_back後置
camera.stoppreview();//停掉原來攝像頭的預覽
camera.release();//釋放資源
camera = null;//取消原來攝像頭
camera = camera.open(i);//打開目前選中的攝像頭
try {
camera.setpreviewdisplay(holder);//通過surfaceview顯示取景畫面
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
setcameradisplayorientation(mainacticity.this, cameraposition, camera);
camera.startpreview();//開始預覽
cameraposition = 0;
break;
}
} else {
//現在是前置, 變更為後置
if(camerainfo.facing == camera.camerainfo.camera_facing_back) {//代表攝像頭的方位,camera_facing_front前置 camera_facing_back後置
cameraposition = 1;
}
}
}
4、還有就是拍照:拍照的話camera有一個回調的監聽
當點選拍照的 時候jpeg對象就是他的一個對象
//快門
camera.autofocus(new autofocuscallback() {//自動對焦
@override
public void onautofocus(boolean success, camera camera) {
// todo auto-generated method stub
if(success) {
//設定參數,并拍照
parameters params = camera.getparameters();
params.setpictureformat(pixelformat.jpeg);//圖檔格式
params.setpreviewsize(800, 480);//圖檔大小
camera.setparameters(params);//将參數設定到我的camera
camera.takepicture(null, null, jpeg);//将拍攝到的照片給自定義的對象
}
}
//建立jpeg圖檔回調資料對象
picturecallback jpeg = new picturecallback() {
public void onpicturetaken(byte[] data, camera camera) {
// todo auto-generated method stub
bitmap bitmap = bitmapfactory.decodebytearray(data, 0, data.length);
imageview.setimagebitmap(bitmap);
camera.stoppreview();//關閉預覽 處理資料
camera.startpreview();//資料處理完後繼續開始預覽
// bitmap.recycle();//回收bitmap空間
} catch (exception e) {
// todo auto-generated catch block
e.printstacktrace();
};
5、然後就是添加他的權限就好了
<!-- 申請使用攝像頭的權限 -->
<uses-permission android:name="android.permission.camera"/>
demo下載下傳:http://download.csdn.net/detail/u012808234/8615947