android相机camera拍照

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 sizes = parameters.getSupportedPictureSizes();
        Collections.sort(sizes, new Comparator() {
            @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);
    }
}


你可能感兴趣的:(android)