Taking pictures with Expo Image Picker crashes on Android when 50MP camera is selected

472 Views Asked by At

My app is crashing when using expo-image-picker on android device to take pictures with camera config set to 3:4 50MP. Sometimes the app simply restarts when I press OK after taking a picture.

It happened in one of my production apps so I thought it might have been something to do with my code, but I created a new expo app with only one button to open the camera and it also crashes as soon as a hit the OK button

It doesn't happen every time, but I couldn't find a pattern. The console shows no logs or messages either

I tried many different things: taking a picture with many colors and information, taking a picture of a black screen, white screen, etc still happens randomly but only when 50MP is set

My App.js and package.json are as follows

package.json

{
  "name": "camera-test",
  "version": "1.0.0",
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web"
  },
  "dependencies": {
    "expo": "~49.0.10",
    "expo-status-bar": "~1.6.0",
    "react": "18.2.0",
    "react-native": "0.72.4",
    "expo-image-picker": "~14.3.2",
    "expo-updates": "~0.18.12"
  },
  "devDependencies": {
    "@babel/core": "^7.20.0"
  },
  "private": true
}

App.js

import * as ImagePicker from 'expo-image-picker';
import React, { useState } from 'react';
import { Button, View } from 'react-native';

export default function App() {
  const [image, setImage] = useState(null);

  const takePicture = async () => {
    const c = await ImagePicker.requestCameraPermissionsAsync();

    if (c.status === "granted") {
      let result = await ImagePicker.launchCameraAsync({
        aspect: [4, 3],
        quality: 0.1,
      });
    }
  };

  return (
    <View style={ { flex: 1, alignItems: 'center', justifyContent: 'center' } }>
      <Button title="Take a picture " onPress={ takePicture } />
    </View>
  );
}

Android studio log

FATAL EXCEPTION: main    Process: com.my.package, PID: 27880 java.lang.RuntimeException: Unable to resume activity {com.my.package/com.my.package.MainActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=219778226, result=-1, data=null} to activity {com.my.package/com.my.package.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.react.ReactDelegate.onActivityResult(int, int, android.content.Intent, boolean)' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5378)
 at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5444)
 at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54)
 at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
 at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574)
 at android.os.Handler.dispatchMessage(Handler.java:106)
 at android.os.Looper.loopOnce(Looper.java:226)
 at android.os.Looper.loop(Looper.java:313)
 at android.app.ActivityThread.main(ActivityThread.java:8757)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
 Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=219778226, result=-1, data=null} to activity {com.my.package/com.my.package.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.react.ReactDelegate.onActivityResult(int, int, android.content.Intent, boolean)' on a null object reference
 at android.app.ActivityThread.deliverResults(ActivityThread.java:5994)
 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5348)
 at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5444) 
 at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54) 
 at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) 
 at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574) 
 at android.os.Handler.dispatchMessage(Handler.java:106) 
 at android.os.Looper.loopOnce(Looper.java:226) 
 at android.os.Looper.loop(Looper.java:313) 
 at android.app.ActivityThread.main(ActivityThread.java:8757) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.react.ReactDelegate.onActivityResult(int, int, android.content.Intent, boolean)' on a null object reference
 at com.facebook.react.ReactActivityDelegate.onActivityResult(ReactActivityDelegate.java:133)
 at com.facebook.react.ReactActivity.onActivityResult(ReactActivity.java:70)
 at android.app.Activity.dispatchActivityResult(Activity.java:8951)
 at android.app.ActivityThread.deliverResults(ActivityThread.java:5987)
 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5348) 
 at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5444) 
 at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54) 
 at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) 
 at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574) 
 at android.os.Handler.dispatchMessage(Handler.java:106) 
 at android.os.Looper.loopOnce(Looper.java:226) 
 at android.os.Looper.loop(Looper.java:313) 
 at android.app.ActivityThread.main(ActivityThread.java:8757) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067) 
2023-09-29 14:24:21.064 27880-27880 DevLauncher  com.my.package  E  DevLauncher tries to handle uncaught exception.
 java.lang.RuntimeException: Unable to resume activity {com.my.package/com.my.package.MainActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=219778226, result=-1, data=null} to activity {com.my.package/com.my.package.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.react.ReactDelegate.onActivityResult(int, int, android.content.Intent, boolean)' on a null object reference
 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5378)
 at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5444)
 at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54)
 at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
 at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574)
 at android.os.Handler.dispatchMessage(Handler.java:106)
 at android.os.Looper.loopOnce(Looper.java:226)
 at android.os.Looper.loop(Looper.java:313)
 at android.app.ActivityThread.main(ActivityThread.java:8757)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
 Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=219778226, result=-1, data=null} to activity {com.my.package/com.my.package.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.react.ReactDelegate.onActivityResult(int, int, android.content.Intent, boolean)' on a null object reference
 at android.app.ActivityThread.deliverResults(ActivityThread.java:5994)
 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5348)
 at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5444) 
 at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54) 
 at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) 
 at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574) 
 at android.os.Handler.dispatchMessage(Handler.java:106) 
 at android.os.Looper.loopOnce(Looper.java:226) 
 at android.os.Looper.loop(Looper.java:313) 
 at android.app.ActivityThread.main(ActivityThread.java:8757) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.react.ReactDelegate.onActivityResult(int, int, android.content.Intent, boolean)' on a null object reference
 at com.facebook.react.ReactActivityDelegate.onActivityResult(ReactActivityDelegate.java:133)
 at com.facebook.react.ReactActivity.onActivityResult(ReactActivity.java:70)
 at android.app.Activity.dispatchActivityResult(Activity.java:8951)
 at android.app.ActivityThread.deliverResults(ActivityThread.java:5987)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5348) 
 at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5444) 
 at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54) 
 at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) 
 at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574) 
 at android.os.Handler.dispatchMessage(Handler.java:106) 
 at android.os.Looper.loopOnce(Looper.java:226) 
 at android.os.Looper.loop(Looper.java:313) 
 at android.app.ActivityThread.main(ActivityThread.java:8757) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067) 
1

There are 1 best solutions below

1
zomega On

There is an error in your code:

if (c.status === "granted") {
  let result = await ImagePicker.launchCameraAsync({
    aspect: [4, 3],
    quality: 0.1,
  });
}
console.log(result);

in the line console.log(result); the variable result is undefined. You have to move it up like this:

if (c.status === "granted") {
  let result = await ImagePicker.launchCameraAsync({
    aspect: [4, 3],
    quality: 0.1,
  });
  console.log(result);
}