[Update: More Details] Android 11 blocks third-party camera apps from appearing in image/video picking intents
Android 11 is changing the way apps interact with third-party camera apps on your device, which will prevent them from appearing in image/video picking intents. In older versions of Android, if an app wants to let users capture an image it can either implement taking pictures within the app (using Android’s various camera APIs) or it can send an intent that can be handled by a dedicated camera app to capture the image instead. If an app decides to go with the latter option, users on older Android releases are presented with a disambiguation dialog to select the camera app of their choice to capture the image. The dialog generally shows all camera apps installed on the user’s device, including third-party camera apps, so long as they are written to respond to certain intents. However, with Android 11, the dialog will only include pre-installed stock camera apps, unless developers specifically target certain third-party camera apps.
The change effectively means that, in most cases, users will have to manually launch third-party camera apps when they want to take a photo, making third-party camera apps less convenient to use. It will also make users blame developers of third-party camera apps when the user finds out their favorite camera app can’t be launched from other apps anymore. Google is implementing this change in Android 11 by preventing third-party camera apps from responding to the following intent actions:
Google says that this change has been set in place in Android 11 to protect the privacy and security of its users. The company doesn’t elaborate on how, but it’s likely that some malicious apps have masqueraded as camera apps to get access to a user’s photos. However, the company does mention a workaround for developers that will allow apps to still launch third-party camera apps. The workaround essentially requires developers to target a specific third-party app of their choice when sending an intent. For example, the developer of a document scanner app can send an explicit intent to launch Adobe Photoshop Camera rather than sending an implicit intent to open up the camera picker. Android 11 makes it so that developers cannot even query the list of apps that can respond to the 3 aforementioned intent actions, which means that a developer will have to know in advance which third-party camera apps they want to support.
Thanks to XDA Senior Member AndroidDeveloperLB for the tip!
Update 1: Google says this change is to maintain privacy
Google has updated its Android 11 behavior changes page with new information on the “media intent actions require system default camera” section (via The Verge). The change, Google explains, is “designed to ensure that the EXIF location metadata is correctly processed based on the location permissions defined within the app sending the intent.” Basically, Google is concerned that apps that haven’t been granted explicit location access yet are making users open up camera apps that have been granted location access, and since the resulting photo that’s passed to the app can contain EXIF location metadata, then the calling app can bypass requesting for location access by reading the location data from the photo. If an app tries to do this in Android 11, it will need to declare
ACCESS_MEDIA_LOCATION as well as
ACCESS_FINE_LOCATION permissions in order to read EXIF location metadata. (Of note, Google closed off another location-access loophole in Android 10 by requiring apps request the
ACCESS_MEDIA_LOCATION permission if an app tries to retrieve unredacted EXIF metadata from photos.)
While this behavior change will affect the ability of apps to launch the user-defined default camera app because of how old and frequently-used the 3 aforementioned intent actions are, Google notes that the change doesn’t affect all intent actions that can launch the user-defined default camera app, such as:
android.provider.MediaStore.INTENT_ACTION_VIDEO_CAMERA. These intents don’t serve the same purpose, though, as they only launch the default camera app rather than allowing for an image to be sent back to the calling app.