Where does android.hardware.camera2.full come from?

Android introduced Camera2 api since Android API 21, this new Camera api makes it more usable and easy to change parameters. The previous version was more limited in its capabilities.

Android Camera2 has 4 levels of implementations that depends on the manufacturer:

  1. Legacy: Its just a conversion between Camera2 and Camera. Just used for compatibility. Just some things of Camera2 work properly.
  2. Limited: Has Camera2 implementation, but not all the methods that are available. (Not all manufacturers implement the same methods so not everything will work on every device)
  3. Full: All methods of Camera2 are implemented. Usually manufacturers implement this on their flagship devices.
  4. Level 3: Additionally support YUV reprocessing and RAW image capture. (BEST CASE)

source here and personal experience.


The feature flags and the names of the camera APIs aren't actually related, even though they look the same.

The feature "android.hardware.camera" (PackageManager.FEATURE_CAMERA) means that the device has a back-facing camera. That's all; any app that wants to avoid being installed on a device with no back-facing camera needs to list that one.

It's not related to the Java android.hardware.Camera class.

The feature "android.hardware.camera.level.full" (PackageManager.FEATURE_CAMERA_LEVEL_FULL) says that at least one camera on the device supports the FULL hardware level when used via the android.hardware.camera2 API package.

So a device with a back-facing camera always lists "android.hardware.camera". If it's got a good camera, it'll also list "android.hardware.camera.level.full".

Since the sample apps for camera2 are meant to run on any quality of camera, they only require there to be a camera device, not that it has any particular level of capability.

I've seen some developers try to require a feature like "android.hardware.camera2"; there's no such feature defined in the Android SDK, so trying to require it means your app can't be installed on any device. The camera2 API is always available starting from Android 5.0 (Lollipop); it's just a question of what hardware level each camera device supports (LEGACY, LIMITED, FULL, or LEVEL_3).


As always, it's best to look in Android source code itself:

* A given camera device may provide support at one of two levels: limited or * full. If a device only supports the limited level, then Camera2 exposes a * feature set that is roughly equivalent to the older * {@link android.hardware.Camera Camera} API, although with a cleaner and more * efficient interface. Devices that implement the full level of support * provide substantially improved capabilities over the older camera * API. Applications that target the limited level devices will run unchanged on * the full-level devices; if your application requires a full-level device for * proper operation, declare the "android.hardware.camera2.full" feature in your * manifest.</p>

I hope that clarifies the nature of the feature you mentioned.

As for the camera2 apis - those were introduced in Android 5 (api level 21) as an attempt to create cleaner apis for interaction with the camera as opposed to the old camera api.