天天看點

SurfaceView調用camera進行顯示與拍照

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

繼續閱讀