Camera2特征代码示例

时间:2015-01-21 14:14:08

标签: android characteristics

那些能给我一个例子如何在android中使用camera2特性的人? F.E.如何使用CONTROL_EFFECT_MODE_SEPIA效果? 尝试使用characteristics.get(CameraCharacteristics.CONTROL_EFFECT_MODE_SEPIA),但它给了我一个The method get(CameraCharacteristics.Key<T>) in the type CameraCharacteristics is not applicable for the arguments (int)。 谢谢。 第一个和第二个都不适合我。我确信我做错了,所以我想展示我的代码,并希望你能帮助我找到解决方案。

@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");  
        }  

    };  

2 个答案:

答案 0 :(得分:0)

您需要在CaptureRequest中设置效果模式; CameraCharacteristics将告诉您支持哪些效果模式。

粗略地说,使用:

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());

答案 1 :(得分: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