Android自定義Camera,用SurfaceView預覽。
阿新 • • 發佈:2019-01-23
- 佈局檔案不用說了,就它了SurfaceView。其他花裡古哨的佈局,自己想著加吧!
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
- surfaceView的findViewById()的事就不說了,直接開始預覽的程式碼
/**
* 開始預覽
*/
private void startPreview() {
holder = surfaceView.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
mCamera = getCustomCamera();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
if (mCamera != null) {
Camera.Parameters parameters = mCamera.getParameters();
// 選擇合適的圖片尺寸,必須是手機支援的尺寸
List<Camera.Size> sizeList = parameters.getSupportedPictureSizes();
// 如果sizeList只有一個我們也沒有必要做什麼了,因為就他一個別無選擇
if (sizeList.size() > 1) {
for (int j = 0; j < sizeList.size(); j++) {
Camera.Size size = sizeList.get(j);
previewWidth = size.width;
previewHeight = size.height;
}
}
//設定照片的大小
parameters.setPictureSize(previewWidth , previewHeight );
mCamera.setParameters(parameters);
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
//呼叫相機預覽功能
mCamera.startPreview();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if (null != mCamera) {
//停止預覽
mCamera.stopPreview();
//釋放相機資源
mCamera.release();
mCamera = null;
}
}
});
}
/**
* 獲取開啟相機
*
* @return
*/
private Camera getCustomCamera() {
if (null == mCamera) {
//Camera.open()方法說明:2.3以後支援多攝像頭,所以開啟前可以通過getNumberOfCameras先獲取攝像頭數目,
// 再通過 getCameraInfo得到需要開啟的攝像頭id,然後傳入Open函式開啟攝像頭,
// 假如攝像頭開啟成功則返回一個Camera物件
try {
mCamera = Camera.open();
//預覽畫面預設是橫屏的,需要旋轉90度
mCamera.setDisplayOrientation(90);
} catch (Exception e) {
}
}
return mCamera;
}
- 預覽已經OK了。簡單至極吧。
- 下面是一個camera拍照的方法:
mCamera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
if (mCamera != null) {
//在拍照完成時,重新開始預覽
mCamera.startPreview();
//轉換成bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
}
}
});
- OK拍照也可以了,再來就是單獨控制閃光燈的開啟和關閉了
if (mCamera != null) {
try {
//開啟閃光燈
Camera.Parameters parameter = mCamera.getParameters();
parameter.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameter);
} catch (Exception e) {
}
}
if (mCamera != null) {
try {
//關閉閃光燈
Camera.Parameters parameter = mCamera.getParameters();
parameter.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameter);
} catch (Exception e) {
}
}
最後在Activity銷燬時,記得要釋放相機資源
@Override
public void onStop() {
super.onStop();
if (null != mCamera) {
//停止預覽
mCamera.stopPreview();
//釋放相機資源
mCamera.release();
mCamera = null;
}
}
OK,自定義camera就完成了。後面會出一篇camera2的使用方法。相比camera,camera2還是比較好使的。