Android 拍照

1.implements SurfaceHolder.Callback

可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程

ExecutorService executorService = Executors.newCachedThreadPool(); public void initView() {


mSurfaceView = findViewById(R.id.surface);

//SurfaceHolder.Callback()用于监听surface的生命周期

mSurfaceHolder.addCallback(this);
mSurfaceHolder = mSurfaceView.getHolder();

@Override
protected void onStart() {
    super.onStart();
    if (this.checkCameraHardware(this) && (mCamera == null)) {
        try {
            setCameraFace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.d("onStart", "onStart");
    }
}
// 设置摄像头方向
public void setCameraFace() {
    int cameraCount = 0;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();// 得到摄像头的个数
    for (int i = 0; i < cameraCount; i++) {
        Camera.getCameraInfo(i, cameraInfo);// 得到每一个摄像头的信息
        // 现在是后置,变更为前置
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            /*
 * 记得释放camera,方便其他应用调用
 */
            releaseCamera();
            // 打开当前选中的摄像头
            mCamera = Camera.open(i);
            if (mCamera != null) {
                Camera.Parameters params = mCamera.getParameters();
                params.setPictureFormat(ImageFormat.JPEG);
                params.setPreviewSize(800, 400);
                // 自动对焦
                //  params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
                params.setJpegQuality(40);
                //  params.setPictureSize(300,300);
                mCamera.setParameters(params);
            }
        }
    }
}
/**
 * 释放mCamera
 */
private void releaseCamera() {
    if (mCamera != null) {
        mCamera.setPreviewCallback(null);
        mCamera.stopPreview();// 停掉原来摄像头的预览
        mCamera.release();
        mCamera = null;
    }
}
/**
 * Check if this device has a camera
 */
private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(
            PackageManager.FEATURE_CAMERA)) {
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}
/**
 * 设置camera显示取景画面,并预览
 *
 * @param camera
 */
private void setStartPreview(Camera camera, SurfaceHolder holder) {
  /*  Log.d("onStart", "setStartPreview");
    try {
        camera.setPreviewDisplay(holder);
        camera.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }*/
    try {
          setCameraFace();
         
        //预览拍照
        mCamera.setPreviewDisplay(holder);
        camera.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
    Log.d("onStart", "surfaceCreated");
    setStartPreview(mCamera, surfaceHolder);
    //  mHandler.postDelayed(runnbale,10000);


}

@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
    Log.d("onStart", "surfaceChanged");
    if (mSurfaceHolder.getSurface() == null) {
        return;
    }

    // stop preview before making changes
    try {
        mCamera.stopPreview();
    } catch (Exception e) {
        // ignore: tried to stop a non-existent preview
    }
    setStartPreview(mCamera, surfaceHolder);

}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
    // 当surfaceview关闭时,关闭预览并释放资源
    releaseCamera();
    mSurfaceHolder = null;
    mSurfaceView = null;
}
void takephoto(final String cardNumber) {
    mCamera.takePicture(null, null, new Camera.PictureCallback() {

        @Override
        public void onPictureTaken(final byte[] bytes, Camera camera) {
           
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    setStartPreview(mCamera, mSurfaceHolder);
                   //设置线程为前端进程
                    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
                    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                    String imgName = "";
                    FileOutputStream fos = null;
                    try {
                        try {
                     //将照片保存到本地
                            fos = new FileOutputStream("/sdcard/DCIM/" + (imgName = "a"+"_"+cardNumber+"_"+                System.currentTimeMillis()) + ".jpg");                       
                        } catch (Exception e) {

                        } finally {
                            fos.flush();
                            fos.close();
                        }
              
                      
            });
        }

    });
}

 如果mCamera.takePicture(null, null, new Camera.PictureCallback() {}方法没有回调

可能的原因是:没有预览拍照   mCamera.setPreviewDisplay(holder); mCamera.startPreview();

猜你喜欢

转载自blog.csdn.net/sunshine_0707/article/details/81290034