android相机camera拍照

来源:互联网 发布:淘宝外贸尾单曝光 编辑:程序博客网 时间:2024/04/26 04:00
package com.donzell.lesson;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.hardware.Camera;import android.os.Bundle;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.widget.LinearLayout;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.util.Collections;import java.util.Comparator;import java.util.List;/** * Created by Donzell on 2017/6/5. * copyringht @ iwhere chengdu technology */public class PhotoActivity extends Activity implements View.OnClickListener{    private SurfaceView mSurfaceView;    private SurfaceHolder mSurfaceHolder;    private int mCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;    Camera mCamera;    private boolean isPreviewIng = false;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_photo);        findViewById(R.id.btnPhoto).setOnClickListener(this);        findViewById(R.id.btnChange).setOnClickListener(this);        mSurfaceView = (SurfaceView) findViewById(R.id.mSurfaceView);        initPhotoView();    }    @Override    public void onClick(View v) {        if(v.getId() == R.id.btnPhoto){            return;        }        if(v.getId() == R.id.btnChange){            switchCamera();            return;        }    }    private void initPhotoView(){        mSurfaceHolder = mSurfaceView.getHolder();        mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {            @Override            public void surfaceCreated(SurfaceHolder holder) {                initCamera();                startPriview();            }            @Override            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {                E("VIEW的尺寸===>width="+width + "    |    height="+height);                if(isfirst){                    isfirst =false;                    resetViewSize();                }            }            @Override            public void surfaceDestroyed(SurfaceHolder holder) {            }        });    }    boolean isfirst = true;    Camera.Size bestsize;    private void initCamera(){        releaseCamera();        mCamera = Camera.open(mCameraId);        mCamera.setDisplayOrientation(90);        try{            mCamera.setPreviewDisplay(mSurfaceHolder);        }catch (Exception e){e.printStackTrace();}        Camera.Parameters parameters = mCamera.getParameters();        bestsize = getBestSize();        E("最佳的尺寸===>width="+bestsize.width + "    |    height="+bestsize.height);        parameters.setPreviewSize(bestsize.width,bestsize.height);        parameters.setPictureSize(bestsize.width,bestsize.height);        mCamera.setParameters(parameters);    }    private void photo(){        mCamera.takePicture(null, null, new Camera.PictureCallback() {            @Override            public void onPictureTaken(byte[] data, Camera camera) {                Bitmap bitmmap = BitmapFactory.decodeByteArray(data,0,data.length);                File file = new File("/storage/sdcard0/360/01.jpg");                try{                    file.createNewFile();                    BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(file));                    bitmmap.compress(Bitmap.CompressFormat.JPEG,100,fos);                    fos.flush();                    fos.close();                }catch (Exception e){e.printStackTrace();}            }        });    }    /**     * 根据预览照片比例调整surfaceview大小     */    private void resetViewSize(){        E("VIEW的尺寸2===>width="+mSurfaceView.getWidth() + "    |    height="+mSurfaceView.getHeight());        float b1 = bestsize.height / (float)bestsize.width;        float v1 = mSurfaceView.getWidth() / (float)mSurfaceView.getHeight();        E("VIEW的尺寸2===>b1="+b1 + "    |    v1="+v1);        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)mSurfaceView.getLayoutParams();        if(b1 > v1){            int newViewHeight = (int)(mSurfaceView.getWidth() * b1);            params. height = newViewHeight;            params.width =  mSurfaceView.getWidth();            int margintX =  -(params.width - mSurfaceView.getHeight()) / 2;            params.leftMargin = margintX;            params.rightMargin = margintX;            E("VIEW的尺寸8===>width="+ params.width + "    |    height="+ params.height +"    |margintX="+margintX );            mSurfaceView.setLayoutParams(params);        }else if(b1 < v1){            int newViewHeight = (int)(mSurfaceView.getHeight() / b1);            params.width = newViewHeight;            params.height =  mSurfaceView.getWidth();            int margintY =  -(params.height - mSurfaceView.getWidth()) / 2;            params.topMargin = margintY;            params.bottomMargin = margintY;            E("VIEW的尺寸8===>width="+ params.width + "    |    height="+ params.height +"    |margintY="+margintY);            mSurfaceView.setLayoutParams(params);        }        E("VIEW的尺寸3===>width="+ params.width + "    |    height="+ params.height );    }    /**     * 获取小于等于640X480尺寸的第一个尺寸大小     * @return     */    private Camera.Size getBestSize(){        int DEFAULT_WIDTH = 640;        int DEFAULT_HEIGHT = 480;        Camera.Parameters parameters = mCamera.getParameters();        List<Camera.Size> sizes = parameters.getSupportedPictureSizes();        Collections.sort(sizes, new Comparator<Camera.Size>() {            @Override            public int compare(Camera.Size lhs, Camera.Size rhs) {                return lhs.width - rhs.width ;            }        });        for (Camera.Size size : sizes){            E("支持的尺寸===>width="+size.width + "    |    height="+size.height);        }        for (Camera.Size size : sizes){            if(size.width >= DEFAULT_WIDTH && size.height >= DEFAULT_HEIGHT){                return size;            }        }        return sizes.get(0);    }    private void switchCamera(){        if(mCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){            mCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;        }else{            mCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;        }        initCamera();        startPriview();    }    private void startPriview(){        stopPriview();        mCamera.startPreview();        isPreviewIng = true;    }    private void stopPriview(){        if(isPreviewIng){            mCamera.stopPreview();            isPreviewIng = false;        }    }    private void releaseCamera(){        if(mCamera != null){            stopPriview();            mCamera.release();            mCamera = null;        }    }    @Override    protected void onDestroy() {        super.onDestroy();        releaseCamera();    }    public static void E(String msg){        Log.e("CAMERA",""+msg);    }}