Search code examples
androidgoogle-playandroid-camera2camera-intrinsics

Difference in the Availability of Camera Intrinsics via the Camera2 API Between Almost Identical Phones


I am well are aware that not all phones yield camera intrinsics via the camera2 API. However, I find it very puzzling that some phones yield intrinsics while other almost identical phones do not. E.g. the Samsung Galaxy S20 FE (SM-G780G) yields intrinsics via the camera2 API, whereas the Samsung Galaxy S20 5G (SM-G981B) strangely does not.

This seems very strange, for the following reasons:

  • The two phones are almost identical (by brand/manufacturer, model, even budget...).
  • The two phones list identical system features related to the camera (e.g. they both have the android.hardware.camera.level.full feature, among many others).
  • (If at all relevant) the two phones also list almost identical system features that don't have anything to do with the camera.

Questions:

  • Why this difference in behavior between almost identical phones?

  • Why does the android.hardware.camera.level.full feature not guarantee the availability of intrinsics? I mean, what does "full" mean here, anyway?

  • How to prevent our app from showing in Google Play for those devices which do not yield intrinsics via the camera2 API?

    • App filtering in Google Play works with system features. Which system feature(s) will conclusively determine whether intrinsics are available?

This confusion also opens even more fundamental questions:

  • If one device of a model variant (e.g. a Samsung S20 FE SM-G780G device) yields intrinsics, does this mean that all devices of the same model variant (i.e. all Samsung S20 FE SM-G780G devices) are also guaranteed to yield intrinsics?

  • If one variant of a model (e.g. Samsung S20 FE SM-G780G) yield intrinsics, does this mean that all other variants of the same model (e.g. Samsung S20 FE SM-G780F) are also guaranteed to yield intrinsics?

Has anyone had any similar experience? Maybe we are doing something wrong?

Many thanks in advance for any help you can give!


Solution

  • The definition of hardware level FULL is here. It used to cover nearly everything the API supported, but since the definition cannot be changed after it is defined (for backwards compatibility reasons), there's a lot of stuff added in later API versions that is not covered by the FULL spec.

    So for example, it doesn't mandate lens calibration information, which is only required for cameras that support either the DEPTH_OUTPUT or LOGICAL_MULTI_CAMERA capabilities.

    Though any device can advertise them if it wants to, even if those capabilities aren't listed.

    Those Samsungs both have two versions, one using a Qualcomm processor, and one using an Exynos processor. I suspect it's the SoC difference that makes a difference on whether the lens calibration fields are present. Each SoC vendor provides a default camera implementation to the manufacturer, and I suspect one vendor has the calibration information present, and the other doesn't. It's also possible one phone does have an additional feature in its default camera app that uses this information, and thus has it populated in the API.

    So I wouldn't necessarily trust that every variant of the same phone has the same capabilities, unfortunately.

    How to prevent our app from showing in Google Play for those devices which do not yield intrinsics via the camera2 API?

    Unfortunately, there's no system feature that covers this, so it's not possible to use Play Store filtering for camera intrinsics.