android 模擬器呼叫系統照相機
在android的模擬器上面呼叫系統的攝像機會出現異常的現象,會自動退出,這可能和模擬器有關,模擬器無法使用系統的硬體,就像重力感應和方向感應系統一樣都無法使用,甚至是GPS
導航系統也無法使用,好像有個第三方的組織,已經模擬出來模擬器上使用重力感應。但是我沒有真正的看到,下面的這幾段是一本書上面寫的android上面使用模擬器的例子。
這個示例將顯示預覽影象,在影象上點選則觸發拍照操作,拍照成功後顯示所拍的照片,然後點選Start選單可以繼續拍照。
首先通過OPhone開發工具(ODT)建立一個OPhone專案,填寫基本資訊後ODT會自動建立一個/src/org/goodev/camera/CameraActivity.java
把main.xml檔案內容修改為如下:
1.<?xmlversion="1.0"encoding="utf-8"?>
2.<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
3.android:orientation="vertical"
4.android:layout_width="fill_parent"
5.android:layout_height="fill_parent"
6.>
7.<SurfaceViewandroid:id
8.android:layout_width="fill_parent"
9.android:layout_height="fill_parent"/>
10.<ImageViewandroid:id="@+id/image"
11.android:layout_width="fill_parent"
12.android:layout_height="fill_parent"/>
13.</LinearLayout>
SurfaceView 用來預覽影象,ImageView 用來顯示所拍的照片。這裡也需讀者會問,為什麼要使用SurfaceView 來預覽影象?使用其他的View不可以嗎?要回答這個問題,需要了解下SurfaceView 的作用,關於SurfaceView 的詳細介紹已超出了本教程的範圍,我們會在後續教程中來詳細介紹SurfaceView ,這裡只做簡要介紹。
在通常情況下,OPhone程式中的View都是在同一個GUI執行緒中繪製的,該執行緒也是接收使用者互動事件的執行緒(例如:按鈕點選事件)。從另外的執行緒修改GUI元素是不可以的,如果要迅速的更新UI顯示該如何辦?顯然在主執行緒中還需要處理其他事件,不適合做這件事情,所以OPhone提供了SurfaceView 來滿足這種需求。一個SurfaceView 包裝一個Surface物件(通過SurfaceHolder操作該物件)而不是Canvas物件,這就是關鍵所在,Surface可以在其他執行緒中繪製,這對於週期性更新和要求高幀率的場景來說是很有用的,特別是在遊戲開發中。Surface中包含了當前UI的原生資料(raw data),在不同的軟體和硬體條件下對這些資料的處理是不一樣的,這就可以通過一些設定來加速圖形的繪製,可以通過SurfaceHolder的setType函式來設定,目前接收如下的引數:
·SURFACE_TYPE_NORMAL:用RAM快取原生資料的普通Surface
·SURFACE_TYPE_HARDWARE:適用於DMA(Direct memory access )引擎和硬體加速的Surface
·SURFACE_TYPE_GPU:適用於GPU加速的Surface
·SURFACE_TYPE_PUSH_BUFFERS:表明該Surface不包含原生資料,Surface用到的資料由其他物件提供,在Camera影象預覽中就使用該型別的Surface,有Camera負責提供給預覽Surface資料,這樣影象預覽會比較流暢。如果在這裡設定了上面三種類型則可以發現不會出現預覽影象,在和Camera底層的預覽機制實現有關,如果對預覽有特殊要求的可以現實PreviewCallback 介面來自己處理。
關於SurfaceView先簡單介紹到這裡,下面來繼續看看如何在程式碼中實現。
修改CameraActivity類使其實現如下介面:
1.android.view.SurfaceHolder.Callback
2.android.view.View.OnClickListener