既然已經(jīng)建立了活動及預(yù)覽Surface,現(xiàn)在我們準(zhǔn)備好開始使用實際的Camera對象。
當(dāng)創(chuàng)建Surface時,由于SurfaceHolder.Callback的存在,它將在代碼中的觸發(fā)調(diào)用surfaceCreated方法。此時可以通過調(diào)用Camera類上的靜態(tài)方法open獲得Camera對象。
Camera camera;
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
隨后,我們想要將預(yù)覽顯示設(shè)置為正在使用的SurfaceHolder,它通過回調(diào)提供給我們的方法。需要將該方法包裝在try...catch塊中,因為它可能會拋出IOException。如果發(fā)生了這種情況,那么我們會希望釋放該Camera對象;否則,它將綁定攝像頭的硬件資源,使其不能用于其他應(yīng)用程序。
try
{
camera.setPreviewDisplay(holder);
}
catch (IOException exception)
{
camera.release();
}
最后,啟動攝像頭預(yù)覽。
camera.startPreview();
}
相應(yīng)地,在surfaceDestroyed中也需要釋放該Camera對象。我們將首先調(diào)用stopPreview,以確保應(yīng)該釋放的資源都被清理。
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
}
運行這段代碼,您可能會發(fā)現(xiàn)預(yù)覽有些奇怪。它會逆時針旋轉(zhuǎn)預(yù)覽圖像90°,如圖2-1所示。