静默拍照

activity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        ordersPresenter = new OrdersPresenter(this);
        requestPermission();

    }

    /**
     * 简单的申请权限,待完善
     */
    private void requestPermission() {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    }

    private void initView() {
        mBtnTakePicture = findViewById(R.id.btn_take_picture);
        mSurface = findViewById(R.id.camera_surface);
        mSurface2 = findViewById(R.id.camera_surface2);
        img = findViewById(R.id.img);
        holder = mSurface.getHolder();//获得句柄
        holder2 = mSurface2.getHolder();


        mBtnTakePicture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                getBackPreview();
//                takBackPicture();
                getFrontPreview();
                takeFrontPicture();
            }
        });
    }

    /**
     * 打开前置摄像头,并设置预览
     */
    private void getFrontPreview() {
        if (mCamera != null) {
            mCamera.stopPreview();//停掉原来摄像头的预览
            mCamera.release();//释放资源
            mCamera = null;//取消原来摄像头
        }
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
        int count = Camera.getNumberOfCameras();
        for (int i = 0; i < count; i++) {
            Camera.getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                try {
                    mCamera = Camera.open(i); // 尝试打开前置摄像头
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        try {
            mCamera.setPreviewDisplay(holder);//通过surfaceview显示取景画面,否则无法拍摄
        } catch (IOException e) {
            e.printStackTrace();
        }
        mCamera.startPreview();//开始预览
    }

//    /**
//     * 打开后置摄像头,并且设置预览
//     */
//    private void getBackPreview() {
//        if (mCamera2 != null) {
//            mCamera2.stopPreview();//停掉原来摄像头的预览
//            mCamera2.release();//释放资源
//            mCamera2 = null;//取消原来摄像头
//        }
//        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
//        int count = Camera.getNumberOfCameras();
//        for (int i = 0; i < count; i++) {
//            Camera.getCameraInfo(i, cameraInfo);
//            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
//                try {
//                    mCamera2 = Camera.open(i); // 尝试打开后置摄像头
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//        try {
//            mCamera2.setPreviewDisplay(holder2);
//        } catch (IOException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
//        mCamera2.startPreview();
//    }

    /**
     * 前置摄像头拍照
     */
    private void takeFrontPicture() {
        mCamera.autoFocus(new Camera.AutoFocusCallback() {//自动对焦
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                // TODO Auto-generated method stub
                if (success) {
                    savePicture(camera, 0 + "", false);
                }
            }
        });
    }

//    /**
//     * 后置摄像头拍照
//     */
//    private void takBackPicture() {
//        mCamera2.autoFocus(new Camera.AutoFocusCallback() {//自动对焦
//            @Override
//            public void onAutoFocus(boolean success, Camera camera) {
//                // TODO Auto-generated method stub
//                if (success) {
//                    savePicture(camera, 1 + "", true);
//                }
//            }
//        });
//    }

    /**
     * 保存图片并且保存成功后调用前置摄像头拍照
     *
     * @param camera    Camera
     * @param cameraId  前后置摄像头
     * @param continued 是否继续执行前置摄像头调用拍照.
     */
    private void savePicture(Camera camera, final String cameraId, final boolean continued) {
        //设置参数,并拍照
        final Camera.Parameters params = camera.getParameters();
        params.setPictureFormat(PixelFormat.JPEG);//图片格式
        params.setPreviewSize(800, 480);//图片大小
        camera.takePicture(null, null, new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                System.out.println("take picture success");
                String name = DateFormat.format("yyyy_MM_dd_hhmmss", Calendar.getInstance(Locale.CHINA)) + cameraId + ".jpg";
                file = new File(PHOTO_PATH);
                file.mkdir(); // 创建文件夹保存照片
                String filename = file.getAbsolutePath() + File.separator + name;
                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
                        data.length);
                try {
                    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(filename));
                    boolean b = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bufferedOutputStream);

                    bufferedOutputStream.flush();
                    bufferedOutputStream.close();



                    ordersPresenter.getOrderFormData("357621097570933", filename);

                    Toast.makeText(MainActivity.this, "照片保存成功", Toast.LENGTH_SHORT).show();

                } catch (Exception e) {
                    e.printStackTrace();
//                } finally {
//                    if (mCamera != null) {
//                        try {
//                            mCamera.setPreviewDisplay(null);
//                            mCamera.stopPreview();
//                            mCamera.release();
//                            mCamera = null;
//                        } catch (IOException e) {
//                            e.printStackTrace();
//                        }
//                    }
//
//                    if (mCamera2 != null) {
//                        try {
//                            mCamera2.setPreviewDisplay(null);
//                            mCamera2.stopPreview();
//                            mCamera2.release();
//                            mCamera2 = null;
//                        } catch (IOException e) {
//                            e.printStackTrace();
//                        }
//                    }
//                    if (continued) {
//                        getFrontPreview();
//                        takeFrontPicture();
//                    }
                }
            }
        });//将拍摄到的照片给自定义的对象
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if (mCamera == null) {
            mCamera = Camera.open(0);
            try {
                mCamera.setPreviewDisplay(holder);//通过surfaceview显示取景画面
                mCamera.startPreview();//开始预览
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        if (mCamera2 == null) {
            mCamera2 = Camera.open(1);
            try {
                mCamera2.setPreviewDisplay(holder);//通过surfaceview显示取景画面
                mCamera2.startPreview();//开始预览
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        holder.removeCallback(this);


        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
        mSurface = null;

        mCamera2.stopPreview();
        mCamera2.release();
        mCamera2 = null;
        mSurface2 = null;
    }

    @Override
    public void onOrdersShow(OrdersBean ordersBean) {
        Log.e("11111111",ordersBean.getCode()+"");
        if (ordersBean.getCode() == 0) {
            Toast.makeText(this, "上传成功", Toast.LENGTH_LONG).show();
            Log.i("1111111", "cgfggggg");
        }
        initDeletePhoto();
    }

    private void initDeletePhoto() {
        FileUtils.deleteAllInDir(PHOTO_PATH);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Camera2 API 进行后台静默拍照的示例代码: ```java public class Camera2Service extends Service { private CameraManager mCameraManager; private ImageReader mImageReader; private Size mImageSize; private CameraDevice mCameraDevice; private CameraCaptureSession mCaptureSession; private HandlerThread mBackgroundThread; private Handler mBackgroundHandler; private static final int STATE_PREVIEW = 0; private static final int STATE_WAITING_LOCK = 1; private static final int STATE_WAITING_PRECAPTURE = 2; private static final int STATE_WAITING_NON_PRECAPTURE = 3; private static final int STATE_PICTURE_TAKEN = 4; private int mState = STATE_PREVIEW; private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice cameraDevice) { mCameraDevice = cameraDevice; startPreview(); } @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { cameraDevice.close(); mCameraDevice = null; } @Override public void onError(@NonNull CameraDevice cameraDevice, int i) { cameraDevice.close(); mCameraDevice = null; } }; private final CameraCaptureSession.StateCallback mSessionCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { mCaptureSession = cameraCaptureSession; try { CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); builder.addTarget(mImageReader.getSurface()); builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); mCaptureSession.setRepeatingRequest(builder.build(), null, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { } }; private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader imageReader) { Image image = imageReader.acquireLatestImage(); // do something with the image image.close(); } }; @Override public void onCreate() { super.onCreate(); mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); mBackgroundThread = new HandlerThread("Camera2Service"); mBackgroundThread.start(); mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); } @Override public int onStartCommand(Intent intent, int flags, int startId) { try { String cameraId = mCameraManager.getCameraIdList()[0]; CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(cameraId); StreamConfigurationMap streamConfigurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); mImageSize = streamConfigurationMap.getOutputSizes(SurfaceTexture.class)[0]; mImageReader = ImageReader.newInstance(mImageSize.getWidth(), mImageSize.getHeight(), ImageFormat.JPEG, 2); mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler); mCameraManager.openCamera(cameraId, mStateCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); stopBackgroundThread(); if (mCameraDevice != null) { mCameraDevice.close(); mCameraDevice = null; } } private void startPreview() { try { CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); SurfaceTexture texture = new SurfaceTexture(0); texture.setDefaultBufferSize(mImageSize.getWidth(), mImageSize.getHeight()); Surface surface = new Surface(texture); builder.addTarget(surface); mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), mSessionCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private void stopBackgroundThread() { if (mBackgroundThread != null) { mBackgroundThread.quitSafely(); try { mBackgroundThread.join(); mBackgroundThread = null; mBackgroundHandler = null; } catch (InterruptedException e) { e.printStackTrace(); } } } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ``` 在 `onStartCommand()` 方法中,我们通过 `CameraManager` 获取相机设备,并创建一个 `ImageReader` 对象,用于获取拍照后的图片数据。然后我们在后台线程中打开相机,并在相机设备状态回调中启动预览。当相机预览开始后,我们就可以在 `CameraCaptureSession` 中发起拍照请求,请求的结果会在 `ImageReader.OnImageAvailableListener` 中回调。注意,在 `onDestroy()` 方法中,我们需要释放相机资源和后台线程。 此示例中我们使用了 `CameraDevice.TEMPLATE_RECORD` 模板来创建拍照请求,这样可以确保在后台静默拍照时能够正常工作。如果您需要更多的控制权,可以尝试使用其他模板,例如 `CameraDevice.TEMPLATE_STILL_CAPTURE`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值