Android Camera2 API: characteristics.availableResultKeys is not listing a key which then again appears in the CaptureResult

Viewed 9

I'm confused about

cameraManager.getCameraCharacteristics(camId).availableCaptureResultKeys  

availableCaptureResultKeys is supposed to tell me, if I can expect a value to be available in the CaptureResult or not. Sadly I cannot rely on this to tell me, if some feature in my app, which relies on this property, should be supported or not. This because some (not all) devices don't list a key in availableCaptureResultKeys, but then still have this value in the CaptureResult.

Here's one (of many) example for the key android.colorCorrection.gains on a Samsung Galaxy S10 device:

cameraManager.openCamera(camId, object : CameraDevice.StateCallback() {

...

CameraCaptureSession.CaptureCallback {
...
override fun onCaptureCompleted(
            session: CameraCaptureSession,
            request: CaptureRequest,
            result: TotalCaptureResult
        ) {
    super.onCaptureCompleted(session, request, result)
    val ccg = result[CaptureResult.COLOR_CORRECTION_GAINS] // <- this is not null ?!
}

But the key android.colorCorrection.gains is not in availableCaptureResultKeys:

0 = {CaptureResult$Key@23037} "CaptureResult.Key(android.colorCorrection.aberrationMode)"
1 = {CaptureResult$Key@23038} "CaptureResult.Key(android.control.aeAntibandingMode)"
2 = {CaptureResult$Key@23039} "CaptureResult.Key(android.control.aeExposureCompensation)"
3 = {CaptureResult$Key@23040} "CaptureResult.Key(android.control.aeLock)"
4 = {CaptureResult$Key@23041} "CaptureResult.Key(android.control.aeMode)"
5 = {CaptureResult$Key@23042} "CaptureResult.Key(android.control.aePrecaptureTrigger)"
6 = {CaptureResult$Key@23043} "CaptureResult.Key(android.control.aeRegions)"
7 = {CaptureResult$Key@23044} "CaptureResult.Key(android.control.aeState)"
8 = {CaptureResult$Key@23045} "CaptureResult.Key(android.control.aeTargetFpsRange)"
9 = {CaptureResult$Key@23046} "CaptureResult.Key(android.control.afMode)"
10 = {CaptureResult$Key@23047} "CaptureResult.Key(android.control.afRegions)"
11 = {CaptureResult$Key@23048} "CaptureResult.Key(android.control.afSceneChange)"
12 = {CaptureResult$Key@23049} "CaptureResult.Key(android.control.afState)"
13 = {CaptureResult$Key@23050} "CaptureResult.Key(android.control.afTrigger)"
14 = {CaptureResult$Key@23051} "CaptureResult.Key(android.control.awbLock)"
15 = {CaptureResult$Key@23052} "CaptureResult.Key(android.control.awbMode)"
16 = {CaptureResult$Key@23053} "CaptureResult.Key(android.control.awbRegions)"
17 = {CaptureResult$Key@23054} "CaptureResult.Key(android.control.awbState)"
18 = {CaptureResult$Key@23055} "CaptureResult.Key(android.control.captureIntent)"
19 = {CaptureResult$Key@23056} "CaptureResult.Key(android.control.effectMode)"
20 = {CaptureResult$Key@23057} "CaptureResult.Key(android.control.mode)"
21 = {CaptureResult$Key@23058} "CaptureResult.Key(android.control.postRawSensitivityBoost)"
22 = {CaptureResult$Key@23059} "CaptureResult.Key(android.control.sceneMode)"
23 = {CaptureResult$Key@23060} "CaptureResult.Key(android.control.videoStabilizationMode)"
24 = {CaptureResult$Key@23061} "CaptureResult.Key(android.control.zoomRatio)"
25 = {CaptureResult$Key@23062} "CaptureResult.Key(android.flash.mode)"
26 = {CaptureResult$Key@23063} "CaptureResult.Key(android.flash.state)"
27 = {CaptureResult$Key@23064} "CaptureResult.Key(android.jpeg.gpsLocation)"
28 = {CaptureResult$Key@23065} "CaptureResult.Key(android.jpeg.orientation)"
29 = {CaptureResult$Key@23066} "CaptureResult.Key(android.jpeg.quality)"
30 = {CaptureResult$Key@23067} "CaptureResult.Key(android.jpeg.thumbnailQuality)"
31 = {CaptureResult$Key@23068} "CaptureResult.Key(android.jpeg.thumbnailSize)"
32 = {CaptureResult$Key@23069} "CaptureResult.Key(android.lens.aperture)"
33 = {CaptureResult$Key@23070} "CaptureResult.Key(android.lens.filterDensity)"
34 = {CaptureResult$Key@23071} "CaptureResult.Key(android.lens.focalLength)"
35 = {CaptureResult$Key@23072} "CaptureResult.Key(android.lens.opticalStabilizationMode)"
36 = {CaptureResult$Key@23073} "CaptureResult.Key(android.noiseReduction.mode)"
37 = {CaptureResult$Key@23074} "CaptureResult.Key(android.scaler.cropRegion)"
38 = {CaptureResult$Key@23075} "CaptureResult.Key(android.sensor.sensitivity)"
39 = {CaptureResult$Key@23076} "CaptureResult.Key(android.sensor.testPatternMode)"
40 = {CaptureResult$Key@23077} "CaptureResult.Key(android.statistics.faces)"
41 = {CaptureResult$Key@23078} "CaptureResult.Key(android.statistics.faceDetectMode)"
42 = {CaptureResult$Key@23079} "CaptureResult.Key(android.statistics.oisSamples)"
43 = {CaptureResult$Key@23080} "CaptureResult.Key(android.statistics.sceneFlicker)"
44 = {CaptureResult$Key@23081} "CaptureResult.Key(android.tonemap.curve)"
  

Is there a way to call availableCaptureResultKeys so that one receives reliable information? Or is it best practice not to rely on availableCaptureResultKeys at all and just try and see if a key appears in the CaptureResult?

0 Answers
Related