Camera的使用。橫豎屏,畫(huà)面不變形
jiep.png
0005.png
一、調(diào)用系統(tǒng)提供的拍照
private void takePic() {
String imgPath = "/sdcard/test/img.jpg";
File file = new File(imgPath);
if(!file.exists()){
File parentFile = file.getParentFile();
parentFile.mkdirs();
}
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent,100);
}
二、自定義Camera
調(diào)用系統(tǒng)的Camera 實(shí)現(xiàn)拍照,UI界面是系統(tǒng)提供的,定制性降低了 。
創(chuàng)建類(lèi)繼承與SurfaceView,并addCallback(this),在回調(diào)初始化預(yù)覽
@Override
public void surfaceCreated(SurfaceHolder holder) {
setStartPreview(mCamera, holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.e("surfaceChanged", " ---- width = " + width + " height = " + height);
Log.e("surfaceChanged", "-----> getDeviceHeight = " + getDeviceHeight());
mSurfaceWidth = width;
mSurfaceHeight = height;
if (mSurfaceHolder.getSurface() == null || mCamera == null) {
return;
}
try {
mCamera.stopPreview();
}catch (Exception e){
e.printStackTrace();
}
setStartPreview(mCamera,mSurfaceHolder);
setCameraParams(width, height);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
- surfaceChanged:拍照狀態(tài)改變時(shí)調(diào)用。當(dāng)我們切換橫豎屏?xí){(diào)用該方法,需要對(duì)預(yù)覽界面大previewsize進(jìn)行處理不然畫(huà)面會(huì)拉伸的很厲害。在
setCameraParams(width, height);
設(shè)置camera預(yù)覽參數(shù)
public void setCameraParams(int width, int height){
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> supportedPictureSizes = parameters.getSupportedPictureSizes();
List<Camera.Size> videoSizes = parameters.getSupportedVideoSizes();
Camera.Size optimalVideoSize = CameraHelper.getOptimalVideoSize(videoSizes, supportedPictureSizes, width, height);
parameters.setPictureFormat(ImageFormat.JPEG);
Log.e("setCameraParams","----- width = " +optimalVideoSize.width +" height = " + optimalVideoSize.height);
parameters.setPreviewSize(optimalVideoSize.width, optimalVideoSize.height);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.setParameters(parameters);
}
主要使用了CameraHelper,在 Android 中錄制視頻時(shí)顯示的 Size 和實(shí)際拍照的 Size 是由 Camera 所決定的,最好的方法是計(jì)算出可支持的 PreviewSize 和 VideoSize 計(jì)算出一個(gè)合適的size,同時(shí)根據(jù)自己視頻的用途,選擇合理的 Size
CameraHelper 參考自 GoogleCameraSample 幫助你計(jì)算出合適的 Size
- surfaceCreated:當(dāng)surface被創(chuàng)建的時(shí)候調(diào)用。在
setStartPreview
方法初始化預(yù)覽
public void setStartPreview(Camera camera, SurfaceHolder surfaceHolder) {
try {
Log.e("setStartPreview", "---- mIsPortrait = " + mIsPortrait);
camera.setPreviewDisplay(surfaceHolder);
if(mIsPortrait){
camera.setDisplayOrientation(90);
}else{
camera.setDisplayOrientation(0);
}
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
- surfaceDestroyed:主要是在surface被銷(xiāo)毀的時(shí)候做一些回收的工作。
拍照
public void capture(View view) {
//自動(dòng)對(duì)焦
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
Log.e("autoFocus", "----- success = " + success);
if (success) {
mCamera.takePicture(null,null,null,mPictureCallback);
}
}
});
}
在mPictureCallback回調(diào)獲取拍照返回。
END