拍照预览

package com.newingscom.takephoto;

import android.Manifest;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.os.Build;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends BaseActivity {

    private SurfaceView sv_camera;
    private SurfaceHolder surfaceHolder;
    private Camera mCamera;
    private String TAG = "mingshine";

    private boolean isPreviewing;
    private Button btn_cancle;
    private Button btn_save;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        permission();
        initView();
        setListener();
    }

    private void initView() {
        setContentView(R.layout.activity_main);
        sv_camera = findViewById(R.id.sv_camera);
        btn_cancle = findViewById(R.id.btn_cancle);
        btn_save = findViewById(R.id.btn_save);
        initCamera();
    }

    private Bitmap takeBitmap = null;

    private void initCamera() {
        // 获得SurfaceView的SurfaceHolder
        surfaceHolder = sv_camera.getHolder();
        // 为surfaceHolder添加一个回调监听器
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format,
                                       int width, int height) {
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                startCamera();
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                // 如果camera不为null ,释放摄像头
                if (mCamera != null) {
                    mCamera.release();
                    mCamera = null;
                }
            }
        });
        // 设置该SurfaceView自己不维护缓冲
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    private void startCamera() {

        //默认开启后置
        mCamera = Camera.open(findFrontCamera() == -1 ? 0 : findFrontCamera());
        mCamera.setDisplayOrientation(90);//摄像头进行旋转90°
        if (mCamera != null) {
            try {
                Camera.Parameters parameters = mCamera.getParameters();
                //设置预览照片的大小
//                parameters.setPreviewFpsRange(100, 120);
                //设置相机预览照片帧数
//                parameters.setPreviewFpsRange(4, 10);
                //设置图片格式
                parameters.setPictureFormat(ImageFormat.JPEG);
                //设置图片的质量
                parameters.set("jpeg-quality", 90);
                mCamera.setPreviewDisplay(surfaceHolder);
                //开始预览
                mCamera.startPreview();
                isPreviewing = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


    private void setListener() {
        sv_camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (isPreviewing && (mCamera != null)) {
                    mCamera.takePicture(mShutterCallback, null, mJpegPictureCallback);
                }
            }
        });
    }

    /*为了实现拍照的快门声音及拍照保存照片需要下面三个回调变量*/
    Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback()
            //快门按下的回调,在这里我们可以设置类似播放“咔嚓”声之类的操作。默认的就是咔嚓。
    {
        public void onShutter() {
            // TODO Auto-generated method stub
            Log.i(TAG, "myShutterCallback:onShutter...");
        }
    };

    Camera.PictureCallback mJpegPictureCallback = new Camera.PictureCallback()
            //对jpeg图像数据的回调,最重要的一个回调
    {
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            Log.i(TAG, "myJpegCallback:onPictureTaken...");
            takeBitmap = null;
            if (null != data) {
                takeBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//data是字节数据,将其解析成位图
                mCamera.stopPreview();
                isPreviewing = false;
                updateBtnVisable(View.VISIBLE);
            }

        }
    };

    //取消
    public void cancle(View view) {
        mCamera.startPreview();
        isPreviewing = true;
        updateBtnVisable(View.INVISIBLE);
        takeBitmap = null;
    }

    //保存
    public void save(View view) {
        mCamera.startPreview();
        isPreviewing = true;
        updateBtnVisable(View.INVISIBLE);
        if (takeBitmap != null) {
            takeBitmap = adjustPhotoRotation(takeBitmap, -90);
            File sdRoot = Environment.getExternalStorageDirectory();
            File file = new File(sdRoot, "takephoto");
            if (!file.exists()) file.mkdirs();
            File bitmapFile = new File(file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".png");
            try {
                FileOutputStream fos = new FileOutputStream(bitmapFile);
                takeBitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
                fos.flush();
                fos.close();
                Toast.makeText(MainActivity.this, "保持成功", Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        takeBitmap = null;
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 如果camera不为null ,释放摄像头
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }
    }

    private int findFrontCamera() {
        int cameraCount = 0;
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        cameraCount = Camera.getNumberOfCameras(); // get cameras number

        for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
            Camera.getCameraInfo(camIdx, cameraInfo); // get camerainfo
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                // 代表摄像头的方位,目前有定义值两个分别为CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK后置
                return camIdx;
            }
        }
        return -1;
    }
    //动态授权

    private void permission() {

        if (Build.VERSION.SDK_INT >= 23) {
            String[] mPermissionList = new String[]{
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.CAMERA};
            ActivityCompat.requestPermissions(MainActivity.this, mPermissionList, 123);
        }
    }

    private void updateBtnVisable(int visable) {
        btn_cancle.setVisibility(visable);
        btn_save.setVisibility(visable);
    }

    Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) {

        Matrix m = new Matrix();
        m.setRotate(orientationDegree, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);

        try {
            Bitmap bm1 = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true);

            return bm1;

        } catch (OutOfMemoryError ex) {
        }
        return null;

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值