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);
}
}
android相机camera拍照
最新推荐文章于 2023-07-30 11:45:00 发布