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);    }}


更多相关文章

  1. android默认字体大小、高度、宽度
  2. android获取屏幕分辨率大小(DisplayMetrics)
  3. 修改dialog的大小
  4. android获取屏幕分辨率大小(DisplayMetrics)
  5. android获取设备存储信息
  6. android 通用的功能集锦
  7. Android中Drawable适配介绍
  8. Android图片的固定大小显示
  9. android ICS4.0.3 改变默认字体大小

随机推荐

  1. android移动补间动画
  2. Android启动各种系统服务线程
  3. Android Service生命周期及用法!
  4. Android使用AIDL实现进程间通信
  5. Android(安卓)UI控件之 焦点问题
  6. Android Platform 3.0 SDK和Eclipse ADT
  7. 【Service 1】Android(安卓)Remote Servi
  8. 关于Android设备屏幕大小及密度的系统参
  9. Android:简易弹幕效果实现,android弹幕
  10. Android成长(二)——两个页面交互