基於android的遠程視頻監控系統——實現,


本帖僅獻給和我一樣熱愛Android開發,並渴望學習的朋友們。
現在我將分享我的學習過程,希望大家通過學習也能夠獨立完成這個簡單的系統。
(PS.這個系統是我在學習java和android一個月的時間內鼓搗出來的,所以沒有基礎的朋友也不要擔心。分幾步,一切就簡單了)

如標題所述,今天我們將學習如何打開攝像頭,並在屏幕上預覽圖像。使用Camera的步驟:
(1)調用Camera的open()方法打開相機;
(2)調用Camera的getParameters()方法獲取拍照參數,該方法返回一個Camera.Parameters對象;
(3)調用Camera的setParameters()方法//android2.3.3以后無需此步;
(4)調用Camera的startPreview()方法開始預覽取景,在預覽取景之前需要調用Camera的setPreviewDisplay(SurfaceHolder holder)方法設置使用哪個surfaceview來顯示取景圖片;
(5)結束程序時,調用Camera的stopPreview()結束取景預覽,並調用release()方法釋放資源。
以上過程參考《瘋狂android講義》,這本書確實不錯,能夠快速入門。整個系統大部分框架是參考此書的,部分問題在網上搜的資料。

1.在AndroidManifest.xml文件中添加camera的權限

    <!-- 授予程序使用攝像頭的權限 -->
        <uses-permission android:name="android.permission.CAMERA" /> 
        <uses-feature android:name="android.hardware.camera" /> 
        <uses-feature android:name="android.hardware.camera.autofocus" />

2.在界面布局文件中添加一個surfaceview用於顯示預覽圖片

<SurfaceView
        android:id="@+id/sView"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        />

3.程序主體
在這里我們定義了一個SurfaceView變量sView用於獲取布局文件中定義的SurfaceView組件。
我們在SurfaceView被創建時調用initcamera()初始化攝像頭,在SurfaceView被銷毀時釋放攝像頭。而這兩個時間是通過surfaceHolder.addCallback得到的,看看下面代碼就明白了。

public class MainActivity extends Activity {

        SurfaceView sView;
        SurfaceHolder surfaceHolder;
        int screenWidth, screenHeight;
        // 定義系統所用的照相機
        Camera camera;
        //是否在瀏覽中
        boolean isPreview = false;
    @Override
        public void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                // 設置全屏
                requestWindowFeature(Window.FEATURE_NO_TITLE);
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
                setContentView(R.layout.activity_main);
                WindowManager wm = (WindowManager) getSystemService(
                        Context.WINDOW_SERVICE);
                Display display = wm.getDefaultDisplay();
                // 獲取屏幕的寬和高
                screenWidth = display.getWidth();
                screenHeight = display.getHeight();
                // 獲取界面中SurfaceView組件
                sView = (SurfaceView) findViewById(R.id.sView);
                // 獲得SurfaceView的SurfaceHolder
                surfaceHolder = sView.getHolder();
                // 為surfaceHolder添加一個回調監聽器
                surfaceHolder.addCallback(new Callback()
                {
                        @Override
                        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                int height)
                        {
                        }
                        @Override
                        public void surfaceCreated(SurfaceHolder holder)
                        {
                                // 打開攝像頭
                                initCamera();
                        }
                        @Override
                        public void surfaceDestroyed(SurfaceHolder holder)
                        {
                                // 如果camera不為null ,釋放攝像頭
                                if (camera != null)
                                {
                                        if (isPreview)
                                                camera.stopPreview();
                                        camera.release();
                                        camera = null;
                                }
                        }                
                });
                // 設置該SurfaceView自己不維護緩沖    
                surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

        private void initCamera()
        {
                if (!isPreview)
                {
                        camera = Camera.open();
                }
                if (camera != null && !isPreview)
                {
                        try
                        {
                                Camera.Parameters parameters = camera.getParameters();
                                // 設置預覽照片的大小
                                parameters.setPreviewSize(screenWidth, screenHeight);
                                // 每秒顯示4幀
                                parameters.setPreviewFrameRate(4);
                                // 設置圖片格式
                                parameters.setPictureFormat(PixelFormat.JPEG);
                                // 設置JPG照片的質量
                                parameters.set("jpeg-quality", 85);
                                //設置照片的大小
                                parameters.setPictureSize(screenWidth, screenHeight);
                                //android2.3.3以后無需下步
                                //camera.setParameters(parameters);
                                //通過SurfaceView顯示取景畫面
                                camera.setPreviewDisplay(surfaceHolder);
                                // 開始預覽
                                camera.startPreview();
                                // 自動對焦
                                camera.autoFocus(null);
                        }
                        catch (Exception e)
                        {
                                e.printStackTrace();
                        }
                        isPreview = true;
                }
        }
    
}

就這樣你就可以使用攝像頭預覽了。當然你會發現預覽的圖像轉了90度,方向不對。我們在AndroidManifest.xml文件的activity屬性設置中添加。

android:screenOrientation="landscape"

設置成橫屏就OK了。如果黑屏請檢查camera.setParameters(parameters);這步是否與自己系統匹配,2.3.3以后是不須此步的。
就這樣簡單,我們就完成了無線視頻監控的第一步,實現了攝像頭圖像的預覽。在這里我們設置了預覽但是卻沒有對每幀圖像數據進行處理,下次將講如何獲得攝像頭的每一幀圖像以及如何處理。

下面是sdk2.3.3下的源碼,在我android4.04系統的手機上也能運行。由於android開發工具的升級,這個源碼包跟以前版本有所不同,不知道和舊版本是否有沖突。如過不行大家新建個工程,再把3個關鍵文件的內容復制過去應該沒問題。

源碼:

CameraPreview.rar

 

值得推薦的活動:1.寫博客推薦高薪工作 寫博客送小米2代&魅族MX

                            2.轉帖就送30下載豆

                            3.關注http://weibo.com/u/2975543812得好禮

 

順便推薦下各地開發QQ群:

廣州群252743081
廣州超級群218251417
南京群 220818530
上海群252742977
深圳群252742753(已滿)
深圳群之二 260134856
成都群 252743807
北京群111059554
西安群252746034
武漢群121592153
杭州群253603803
廈門群253604146
湖南群217494504
大連群253672904
青島群 257925319


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM