0

guys who can give me an example how to use camera2 characteristics in android? F.e. how to use CONTROL_EFFECT_MODE_SEPIA effect ? Have tried to use characteristics.get(CameraCharacteristics.CONTROL_EFFECT_MODE_SEPIA), but it gave me an The method get(CameraCharacteristics.Key<T>) in the type CameraCharacteristics is not applicable for the arguments (int). Thanks. Neither first one nor second one didn't work for me. I am sure i am doing something wrong, so i want to show my code, and hope you can help me to find a solution.

@Override
public void openCamera() {
        CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);  
        Log.e(TAG, "openCamera E");  

        try {  
            String cameraId = manager.getCameraIdList()[0];  
            characteristics = manager.getCameraCharacteristics(cameraId);
            StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

            mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0];

            Log.e(TAG, "Preview size is: " + mPreviewSize.toString());
            manager.openCamera(cameraId, mStateCallback, null);


        } catch (CameraAccessException e) {  
            e.printStackTrace();  
        }  
        Log.e(TAG, "openCamera X");  

    }

    public void updatePreview() {  
        if(null == mCameraDevice) {  
            Log.e(TAG, "updatePreview error, return");  
        }  

        mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_OFF);  
        HandlerThread thread = new HandlerThread("CameraPreview");  
        thread.start();  
        backgroundHandler = new Handler(thread.getLooper());  

        try {  
            mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler);  
        } catch (CameraAccessException e) {  
            e.printStackTrace();  
        }  
    } 

    @Override
    public void startPreview() {

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

        SurfaceTexture texture = myTexture.getSurfaceTexture();  
        if(null == texture) {  
            Log.e(TAG,"texture is null, return");  
            return;  
        }  

        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        Surface surface = new Surface(texture);  

        try {  
            mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);  

        } catch (CameraAccessException e) {  
             e.printStackTrace();  
        }  
        mPreviewBuilder.addTarget(surface);  

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

                @Override  
                public void onConfigured(CameraCaptureSession session) {  
                    mPreviewSession = session;
                    updatePreview();  
                }  

                @Override  
                public void onConfigureFailed(CameraCaptureSession session) {  
                    Log.e(TAG,"onConfiguration failed.");  
                }  
            }, null);  
        } catch (CameraAccessException e) {  
                e.printStackTrace();  
        }  


    }

    private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {  

        @Override  
        public void onOpened(CameraDevice camera) {  
            Log.e(TAG, "onOpened");  
            mCameraDevice = camera;  
            startPreview();  
        }  

        @Override  
        public void onDisconnected(CameraDevice camera) {  
            Log.e(TAG, "onDisconnected");  
        }  

        @Override  
        public void onError(CameraDevice camera, int error) {  
            Log.e(TAG, "onError");  
        }  

    };  
user0770
  • 797
  • 3
  • 11
  • 22

2 Answers2

0

You need to set the effect mode in your CaptureRequest; CameraCharacteristics will tell you what effect modes are supported.

Roughly, use:

int[] supportedEffects = characteristics.get(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS);
int selectedEffect = supportedEffects[0]; // select effect you want here
requestBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, selectedEffect);
captureSession.setRepeatingRequest(requestBuilder.build());
Eddy Talvala
  • 17,243
  • 2
  • 42
  • 47
  • Sorry guys, but i couldn't make it work and have edited my post and added my code there. Please have a look on it. Thanks – user0770 Jan 22 '15 at 13:16
  • The both ways mentioned above work fine. I couldn't make it work in Nexux 5 tablet until i realized that it was because of the device. – user0770 Jan 23 '15 at 11:13
  • Is there a way to get their respective names? Like SEPIA, NEGATIVE as it was in Camera1 api. – harsh_v Feb 24 '17 at 11:05
  • Is there a way to get the string names of the effects? – Duna Apr 09 '19 at 12:28
0
mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
mPreviewBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, CameraMetadata.CONTROL_EFFECT_MODE_NEGATIVE);
mCameraCaptureSession.setRepeatingRequest(mPreviewBuilder.build(), mPreviewSessionCallback, mHandler);

exaple:https://github.com/pinguo-yuyidong/Camera2/blob/master/app/src/main/java/us/yydcdut/androidltest/listener/EffectItemClickListener.java

yydcdut
  • 801
  • 6
  • 9