0

I am making a custom camera using camera-api 2.Everything is working properly means i am able to capture picture,setting preview ect.But my problem is that its not dislaying auto-focus rectangular indicator that the native camera has.I want to display rectangular box(default android auto-focus frame) showing in image.

enter image description here So how can I display it in my custome camera.I am using below code for open camera

 private TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener()
{

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
    {
        Log.e(TAG, "onSurfaceTextureAvailable, width=" + width + ",height=" + height);

        openCamera(width, height);
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height)
    {
        Log.e(TAG, "onSurfaceTextureSizeChanged");
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface)
    {
        surface.release();
        if (mCameraDevice != null) {
            mCameraDevice.close();
        }

        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface)
    {
        // Log.e(TAG, "onSurfaceTextureUpdated");
    }

};

and below is openCamera ()

  private void openCamera(int width, int height)
{

    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    Log.e(TAG, "openCamera E");
    try {
        String cameraId = "";
        if (cameraFront) {
            cameraId = "" + findFrontFacingCamera();
        } else {
            cameraId = "" + findBackFacingCamera();
        }
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);

        StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        // mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[Integer.parseInt(cameraId)];

        Size largest =
                Collections.max(Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)), new CompareSizesByArea());

        // Danger, W.R.! Attempting to use too large a preview size could exceed the camera
        // bus' bandwidth limitation, resulting in gorgeous previews but the storage of
        // garbage capture data.
        mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height, largest);

        // We fit the aspect ratio of TextureView to the size of preview we picked.
        manager.openCamera(cameraId, mStateCallback, null);

    } catch (CameraAccessException e) {
        AppLogger.exception(myContext, getClass().getSimpleName(), e);
        // e.printStackTrace();
    }
    Log.e(TAG, "openCamera X");
}

and for preview below code i am using

protected void startPreview()
{
    try {

        if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) {
            Log.e(TAG, "startPreview fail, return");
            return;
        }

        SurfaceTexture texture = mTextureView.getSurfaceTexture();
        if (null == texture) {
            Log.e(TAG, "texture is null, return");
            return;
        }
        Log.e(TAG, "Width: " + mPreviewSize.getWidth() + "  Hieght : " + mPreviewSize.getHeight());
        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        Surface surface = new Surface(texture);

        try {
            mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

        } catch (CameraAccessException e) {
            AppLogger.exception(myContext, getClass().getSimpleName(), e);
            // e.printStackTrace();
        }
        mPreviewBuilder.addTarget(surface);

        mCameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback()
        {

            @Override
            public void onConfigured(CameraCaptureSession session)
            {

                mPreviewSession = session;
                updatePreview();
            }

            @Override
            public void onConfigureFailed(CameraCaptureSession session)
            {

            }
        }, null);
    } catch (CameraAccessException e) {
        AppLogger.exception(myContext, getClass().getSimpleName(), e);
        // e.printStackTrace();
    }
}

Thanks

Android dev
  • 273
  • 2
  • 5
  • 23

0 Answers0