在遍歷完所有支持的大小之后,必須確保獲得了所需要的值。如果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();
}