正文

使用Camera類(10)

Android多媒體開發(fā)高級編程 作者:(美)艾佛瑞


在遍歷完所有支持的大小之后,必須確保獲得了所需要的值。如果bestHeight和bestWidth變量等于0,那么沒有發(fā)現(xiàn)任何與我們的需要相匹配的大小,或者只存在一種支持的大小,從而不應(yīng)采取任何操作。反之,如果它們有值,那么將使用bestWidth和bestHeight變量調(diào)用Camera.Parameters對象上的setPreviewSize方法。

另外,還需要告訴攝像頭預(yù)覽SurfaceView對象(即cameraView)以該大小進行顯示。如果不這么做,那么SurfaceView不會改變大小,且來自攝像頭的預(yù)覽圖像會扭曲或質(zhì)量非常低。

要采用Camera類捕獲圖像,必須調(diào)用takePicture方法。該方法接受3個或4個參數(shù),所有這些參數(shù)都是回調(diào)方法。takePicture方法的最簡單形式是將所有的參數(shù)都設(shè)置為null。盡管能夠捕獲照片,但是不能獲得它的引用。因此,至少應(yīng)該實現(xiàn)一種回調(diào)方法。一種最安全的回調(diào)方法是Camera.PictureCallback.onPictureTaken。它確保會被調(diào)用,并且在壓縮圖像時被調(diào)用。為了利用該方法,我們將在活動中實現(xiàn)Camera.PictureCallback,并添加一個onPictureTaken方法。

public class SnapShot extends Activity implements

   SurfaceHolder.Callback, Camera.PictureCallback {

   public void onPictureTaken(byte[] data, Camera camera) {

   }

該onPictureTaken方法有兩個參數(shù):第一個是實際的JPEG圖像數(shù)據(jù)的字節(jié)數(shù)組,第二個是捕獲該圖像的Camera對象的引用。

由于給定了實際的JPEG數(shù)據(jù),因此為了保存它,只需要將其寫入磁盤的某個位置。正如我們已經(jīng)知道的那樣,可以利用MediaStore指定它的位置和元數(shù)據(jù)。

當(dāng)執(zhí)行onPictureTaken方法時,可以調(diào)用Camera對象上的startPreview。當(dāng)調(diào)用takePicture方法時預(yù)覽已經(jīng)自動暫停,并且這個方法會告訴我們,現(xiàn)在可以安全地重新啟動它。

public void onPictureTaken(byte[] data, Camera camera) {

     Uri imageFileUri = getContentResolver().insert(Media.EXTERNAL_

CONTENT_URI, new ContentValues());

     try {

       OutputStream imageFileOS = getContentResolver().

openOutputStream(imageFileUri);

       imageFileOS.write(data);

       imageFileOS.flush();

       imageFileOS.close();

     }catch (FileNotFoundException e) {

     } catch (IOException e) { 

     } 

     camera.startPreview();

}


上一章目錄下一章

Copyright ? 讀書網(wǎng) www.dappsexplained.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號