Android Camera的使用(一) 读书笔记
生活随笔
收集整理的這篇文章主要介紹了
Android Camera的使用(一) 读书笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文地址
https://blog.csdn.net/junzia/article/details/52301199
?
拍照步驟
1.添加權限
2.開啟相機時check一下是否有攝像頭
3.對預覽大小、照片大小和對焦方式進行設置;對相機預覽方向進行設置;
4.相機預覽前,必須設置預覽的承載;對預覽View大小進行設置
5.相機預覽時拍照,圖像回調,對拍照的結果進行裁剪,使圖片結果和預覽結果相同,對前攝像頭拍攝的結果還需要做對稱變換。
?
相機的控制類CameraKitKat源碼
public class CameraKitKat extends ACamera{private Camera camera;private SurfaceHolder holder;private float displayScale;public CameraKitKat(SurfaceView surfaceView) {super(surfaceView);init();}private void init(){holder=displayView.getHolder();}//獲得一個相機實例@Overridepublic void open(int type){
//獲取預覽方向設置int rotation=((WindowManager)displayView.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
//判斷相機是否開啟if(!openCamera(type))return;
//修改相機設置setParameters(camera,rotation);
//設置正確的預覽方向setDisplayOrientation(camera,rotation);
//設置預覽的承載,如果沒有這一步,相機無法開始預覽setPreviewDisplay(camera,holder);
//開啟預覽camera.startPreview();}@Overridepublic void close(){camera.stopPreview();camera.release();}//調整SurfaceView的大小private void resizeDisplayView(){
//獲得相機實例的默認設置Camera.Parameters parameters=camera.getParameters();
//將預覽View的Size和Camera的PreviewSize設置相同Camera.Size size=parameters.getPreviewSize();
//返回布局參數的引用FrameLayout.LayoutParams p= (FrameLayout.LayoutParams) displayView.getLayoutParams();float scale=size.width/(float)size.height;displayScale=displayView.getHeight()/(float)displayView.getWidth();if(scale>displayScale){p.height= (int) (scale*displayView.getWidth());p.width=displayView.getWidth();}else{p.width= (int) (displayView.getHeight()/scale);p.height=displayView.getHeight();}Log.e("wuwang","-->"+size.width+"/"+size.height);Log.e("wuwang","--<"+p.height+"/"+p.width);displayView.setLayoutParams(p);displayView.invalidate();}
//獲得當前設備的Camera個數,為0表示不支持攝像頭private boolean checkCameraId(int cameraId){return cameraId>=0&&cameraId<Camera.getNumberOfCameras();}//相機使用第一步,打開相機,獲得相機實例private boolean openCamera(int cameraId){if(!checkCameraId(cameraId))return false;camera=Camera.open(cameraId);return true;}//相機使用第二步,設置相機實例參數//TODO :里面還存在問題,需要修改private void setParameters(Camera camera,int rotation){Camera.Parameters parameters=camera.getParameters();//PreviewSize設置為設備支持的最高分辨率final Camera.Size size=Collections.max(camera.getParameters().getSupportedPreviewSizes(),new Comparator<Camera.Size>() {@Overridepublic int compare(Camera.Size lhs, Camera.Size rhs) {return lhs.width*lhs.height-rhs.width*rhs.height;}});parameters.setPreviewSize(size.width,size.height);//PictureSize設置為和預覽大小最近的Camera.Size picSize=Collections.max(parameters.getSupportedPictureSizes(), new Comparator<Camera.Size>() {@Overridepublic int compare(Camera.Size lhs, Camera.Size rhs) {return (int) (Math.sqrt(Math.pow(size.width-rhs.width,2)+Math.pow(size.height-rhs.height,2))-Math.sqrt(Math.pow(size.width-lhs.width,2)+Math.pow(size.height-lhs.height,2)));}});parameters.setPictureSize(picSize.width,picSize.height);//如果相機支持自動聚焦,則設置相機自動聚焦,否則不設置if(parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)){parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);}//設置顏色效果 // parameters.setColorEffect(Camera.Parameters.EFFECT_MONO);camera.setParameters(parameters);resizeDisplayView();}//相機使用第三步,設置相機預覽方向private void setDisplayOrientation(Camera camera,int rotation){if(rotation== Surface.ROTATION_0||rotation==Surface.ROTATION_180){camera.setDisplayOrientation(90);}else{camera.setDisplayOrientation(0);}}//相機使用第四步,設置相機預覽載體SurfaceHolderprivate void setPreviewDisplay(Camera camera,SurfaceHolder holder){try {camera.setPreviewDisplay(holder);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void measureSize(int width, int height) {super.measureSize(width, height);}
//拍照@Overridepublic void takePicture() {super.takePicture();camera.takePicture(new Camera.ShutterCallback() {@Override
//原始圖像數據回調public void onShutter() {}}, new Camera.PictureCallback() {@Override
//展示圖像數據的回調public void onPictureTaken(byte[] data, Camera camera) {}}, new Camera.PictureCallback() {@Override
//JPEG圖像數據的回調public void onPictureTaken(byte[] data, Camera camera) {if(pictureCallback!=null){pictureCallback.onPictureTaken(data,displayScale);}}});} }
?
轉載于:https://www.cnblogs.com/hyating/p/9007731.html
總結
以上是生活随笔為你收集整理的Android Camera的使用(一) 读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vscode插件的开发与发布流程
- 下一篇: 快速设置 App 图标 - iOS/An