I bought a used Fairphone 4 and installed LineageOS with MicroG on it after unlocking the bootloader. One of the original Fairphone apps I wanted to use was the stock camera app "FPCamera.apk" (com.fp.camera). At first I extracted it from the official firmware download FP4-TP1V-factory.zip with the help of simg2img (from android-sdk-libsparse-utils) and lpunpack:
$ unzip FP4-TP1V-factory.zip images/super.img $ file super.img super.img: Android sparse image, version: 1.0, Total of 1572864 4096-byte output blocks in 226 input chunks. $ simg2img super.img super.nonsparse.img $ file super.nonsparse.img super.nonsparse.img: data $ binwalk super.nonsparse.img DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 1048576 0x100000 Linux EXT filesystem, blocks count: 277, image size: 283648, rev 1.0, ext2 filesystem data, UUID=f9a4283a-08b7-55e3-b63b-e404b5acb5ac, volume name "odm" [...] $ lpunpack super.nonsparse.img extracted Extracting partition [odm_a] .... [ok] Extracting partition [odm_b] .... [ok] Extracting partition [product_a] .... [ok] Extracting partition [product_b] .... [ok] Extracting partition [system_a] .... [ok] Extracting partition [system_b] .... [ok] Extracting partition [system_ext_a] .... [ok] Extracting partition [system_ext_b] .... [ok] Extracting partition [vendor_a] .... [ok] Extracting partition [vendor_b] .... [ok] $ cd extracted $ file system_a.img system_a.img: Linux rev 1.0 ext2 filesystem data, UUID=2aa70c42-cce6-5610-9956-5fcc24a421ec (extents) (large files) (huge files) $ mkdir system_a $ sudo mount -o ro system_a.img system_a $ cp system_a/system/priv-app/FPCamera/FPCamera.apk .
Then I installed FPCamera.apk onto the LineageOS Fairphone with adb install. Upon starting the camera app, I asked for some permissions and then said:
Permissions denied. You can change them in Settings > Apps.
I already had given it all permissions it asked for and that were selectable: Camera, Microphone, Location.
adb logcat showed that it asks for another permission WRITE_EXTERNAL_STORAGE:
CAM_PermissionUtils: checkPermissions, [android.permission.WRITE_EXTERNAL_STORAGE] ActivityTaskManager: START u0 {act=android.content.pm.action.REQUEST_PERMISSIONS pkg=com.android.permissioncontroller cmp=com.android.permissioncontroller/.permission.ui.GrantPermissionsActivity (has extras)} from uid 10190 CompatibilityChangeReporter: Compat change id reported: 174042980; UID 10190; state: DISABLED CAM_QuickActivity: onCreate return, by permission check!
It turns out that Android 13 does not allow apps to ask for that permission anymore as described in Android Developers: Granular media permissions and WRITE_EXTERNAL_STORAGE:
Note: If your app targets Build.VERSION_CODES.R (Android 11) or higher, this permission has no effect.
So the Fairphone camera app has a higher target but the code was not adjusted - on the Fairphone OS, this is not needed because Camera is a system app with pre-allowed permissions in system/etc/permissions/privapp-permissions-platform.xml.
The solution is to manually give the permission via adb:
$ adb shell pm grant com.fp.camera android.permission.WRITE_EXTERNAL_STORAGE
The Fairphone Camera app expects "Google Photos" to be installed, otherwise you cannot view the taken photos. Installing the camera proxy app solved that problem.