正文

使用Camera類(lèi)(10)

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


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

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

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

public class SnapShot extends Activity implements

   SurfaceHolder.Callback, Camera.PictureCallback {

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

   }

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

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

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

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 ? 讀書(shū)網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)