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