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ī)拍照的原理和步驟有所幫助。