[expo-image-picker] launchCameraAsync doesn’t open the camera on Android after the 2025-09-05 security update
Problem
Minimal reproducible example https://github.com/deka0106/expo-image-picker-test Steps to reproduce After applying the Android security patch 2025-09-05, calling `launchCameraAsync()` from `expo-image-picker` does not show the camera UI immediately. The camera only appears after the app is backgrounded and then resumed. It can be reproduced with the following steps: - Clone reproducible example - Run `pnpm install` - Run `pnpm run android` - Tap "Open Camera" When tapping "Open Camera", logcat outputs the following: [code block] I’ve confirmed the issue reproduces in the following environments: - Device: Pixel 9a, Pixel 8, Pixel 7a, Pixel 6 - Android OS: 16 - Security Update: 2025-09-05 Environment [code block] Expo Doctor Diagnostics [code block]
Unverified for your environment
Select your OS to check compatibility.
1 Fix
Solution: [expo-image-picker] launchCameraAsync doesn’t open the camera on Android after the 2025-09-05 security update
I suspect the cause is that when the permission has already been granted, the `askForPermissions` call doesn’t return a response (i.e., it never resolves). As a quick test, I ran the code below. The `status` remained `pending`, and it only changed to `granted` after I sent the app to the background once and then came back. [code block] I observed the same behavior with `expo-camera`’s `useCamer
Trust Score
3 verifications
- 1
I suspect the cause is that when the permission has already been granted, the `a
I suspect the cause is that when the permission has already been granted, the `askForPermissions` call doesn’t return a response (i.e., it never resolves).
tsxconst [status, setStatus] = useState<'granted' | 'denied' | 'pending'>(); const requestPermission = async () => { setStatus('pending'); const result = await ImagePicker.requestCameraPermissionsAsync(); setStatus(result.granted ? 'granted' : 'denied'); } return ( <View style={styles.container}> <Button title="Request Permission" onPress={requestPermission} /> {status && <Text>{status}</Text>} </View> ); - 2
As a quick test, I ran the code below. The `status` remained `pending`, and it o
As a quick test, I ran the code below. The `status` remained `pending`, and it only changed to `granted` after I sent the app to the background once and then came back.
- 3
I observed the same behavior with `expo-camera`’s `useCameraPermissions` and wit
I observed the same behavior with `expo-camera`’s `useCameraPermissions` and with `expo-location`’s `useForegroundPermissions`.
Validation
Resolved in expo/expo GitHub issue #39480. Community reactions: 2 upvotes.
Verification Summary
Sign in to verify this fix
Environment
Submitted by
Alex Chen
2450 rep