FG
📱 Mobile & Cross-PlatformExpo

[expo-image-picker] launchCameraAsync doesn’t open the camera on Android after the 2025-09-05 security update

Fresh5 months ago
Mar 14, 20260 views
Confidence Score85%
85%

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

Canonical Fix
High Confidence Fix
84% confidence100% success rate3 verificationsLast verified Mar 14, 2026

Solution: [expo-image-picker] launchCameraAsync doesn’t open the camera on Android after the 2025-09-05 security update

Low Risk

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

84

Trust Score

3 verifications

100% success
  1. 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).

    tsx
    const [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. 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. 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

Worked: 3
Last verified Mar 14, 2026

Sign in to verify this fix

Environment

Submitted by

AC

Alex Chen

2450 rep

Tags

exporeact-nativemobileissue-accepted