minDiff = Double.MAX_VALUE;

for (Camera.Size size : sizes) {

if (Math.abs(size.height – height)

optimalSize = size;

minDiff = Math.abs(size.height – height);

}

}

}

return optimalSize;

}

“`

以上代碼中,mSurfaceHolderCallback是SurfaceHolder.Callback的一個(gè)實(shí)現(xiàn),用于監(jiān)聽SurfaceView的狀態(tài)變化。在surfaceCreated方法中,我們打開相機(jī)并將預(yù)覽顯示在SurfaceView上;在surfaceChanged方法中,調(diào)整相機(jī)預(yù)覽的大小,并開始相機(jī)預(yù)覽;在surfaceDestroyed方法中,釋放相機(jī)資源。

接下來,我們可以添加一個(gè)按鈕,用于觸發(fā)拍照事件:

“`java

Button mCaptureButton = (Button) findViewById(R.id.captureButton);

mCaptureButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mCamera.takePicture(null, null, mPictureCallback);

}

});

“`

在mCaptureButton的點(diǎn)擊事件中,調(diào)用mCamera.takePicture方法進(jìn)行拍照。mPictureCallback是Camera.PictureCallback的一個(gè)實(shí)現(xiàn),用于處理拍照結(jié)果:

“`java

private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {

@Override

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

// 處理拍照結(jié)果

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

// 保存圖片到本地

String filePath = Environment.getExternalStorageDirectory().getPath() + “/image.jpg”;

try {

FileOutputStream fos = new FileOutputStream(filePath);

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

// 重新開始相機(jī)預(yù)覽

mCamera.startPreview();

}

};

“`

在mPictureCallback的onPictureTaken方法中,我們可以將拍照結(jié)果轉(zhuǎn)換為Bitmap對(duì)象,并保存到本地。最后,重新開始相機(jī)預(yù)覽。

至此,我們已經(jīng)完成了在app開發(fā)中調(diào)用相機(jī)拍照的步驟。通過上述代碼,我們可以實(shí)現(xiàn)一個(gè)簡單的相機(jī)應(yīng)用,用戶點(diǎn)擊按鈕即可拍照并保存到本地。當(dāng)然,為了更好的用戶體驗(yàn),我們還可以添加相機(jī)預(yù)覽的自定義界面、拍照參數(shù)的設(shè)置等功能,這需要根據(jù)具體需求進(jìn)行擴(kuò)展。希望本文對(duì)您理解相機(jī)拍照的原理和步驟有所幫助。

未經(jīng)允許不得轉(zhuǎn)載:智電網(wǎng)絡(luò) NET » app開發(fā)中如何調(diào)動(dòng)相機(jī)拍照?

相關(guān)推薦