Skip to content

[@capacitor/camera] - Android - RuntimeException: java.lang.reflect.InvocationTargetException #2175

@ssnielsen

Description

@ssnielsen

Bug Report

Plugin(s)

@capacitor/camera — version 6.0.0

Capacitor Version

Latest Dependencies:

@capacitor/cli: 6.1.2
@capacitor/core: 6.1.2
@capacitor/android: 6.1.2
@capacitor/ios: 6.1.2

Installed Dependencies:

@capacitor/cli: 6.1.0
@capacitor/core: 6.1.0
@capacitor/ios: 6.1.0
@capacitor/android: 6.1.0

Platform(s)

Android

Current Behavior

On our app's Sentry tracker (and in the Play Store console's "Crashes and ANRs" page), we're seeing quite a few users being hit by an issue occurring when the camera plugin attempts to call unregister on the pickMultipleMedia ActivityResultHandler.
This has started happening after updating to Capacitor 6.
(See the full stack trace in the bottom of this post)

We haven't been able to reproduce this on our own (not for lack of trying though).

Expected Behavior

That this crash doesn't happen.

Code Reproduction

As mentioned, we haven't been able to reproduce this — neither in our own app nor in a minimal sample scenario.

Other Technical Details

There's seemingly no pattern wrt. Android versions / device types being more affected than others as far as we can see in our data.

Looking at the implementation in CameraPlugin.java's override of onDestroy and how it calls unregister, I wonder if it would make sense to also add a similar null-checking guard before calling unregister on the other unregister call on line 381. Or would that just "hide" an underlying issue?

Additional Context

Stack trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.activity.result.ActivityResultLauncher.unregister()' on a null object reference
    at com.capacitorjs.plugins.camera.CameraPlugin.lambda$openPhotos$3(CameraPlugin.java:381)
    at com.capacitorjs.plugins.camera.CameraPlugin.$r8$lambda$fTjbhwXpo9A6PA35qcfl__8nKdQ
    at com.capacitorjs.plugins.camera.CameraPlugin$$ExternalSyntheticLambda3.onActivityResult
    at androidx.activity.result.ActivityResultRegistry.register(ActivityResultRegistry.java:227)
    at com.capacitorjs.plugins.camera.CameraPlugin.registerActivityResultLauncher(CameraPlugin.java:334)
    at com.capacitorjs.plugins.camera.CameraPlugin.openPhotos(CameraPlugin.java:350)
    at com.capacitorjs.plugins.camera.CameraPlugin.pickImages(CameraPlugin.java:137)
    at java.lang.reflect.Method.invoke(Method.java)
    at com.getcapacitor.PluginHandle.invoke(PluginHandle.java:138)
    at com.getcapacitor.Bridge.lambda$callPluginMethod$0(Bridge.java:820)
    at com.getcapacitor.Bridge.$r8$lambda$ehFTi5f4HhVNFKTbCKAYDkpQYRA
    at com.getcapacitor.Bridge$$ExternalSyntheticLambda3.run
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:226)
    at android.os.Looper.loop(Looper.java:313)
    at android.os.HandlerThread.run(HandlerThread.java:67)
java.lang.reflect.InvocationTargetException: null
    at java.lang.reflect.Method.invoke(Method.java)
    at com.getcapacitor.PluginHandle.invoke(PluginHandle.java:138)
    at com.getcapacitor.Bridge.lambda$callPluginMethod$0(Bridge.java:820)
    at com.getcapacitor.Bridge.$r8$lambda$ehFTi5f4HhVNFKTbCKAYDkpQYRA
    at com.getcapacitor.Bridge$$ExternalSyntheticLambda3.run
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:226)
    at android.os.Looper.loop(Looper.java:313)
    at android.os.HandlerThread.run(HandlerThread.java:67)
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at com.getcapacitor.Bridge.lambda$callPluginMethod$0(Bridge.java:829)
    at com.getcapacitor.Bridge.$r8$lambda$ehFTi5f4HhVNFKTbCKAYDkpQYRA
    at com.getcapacitor.Bridge$$ExternalSyntheticLambda3.run
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:226)
    at android.os.Looper.loop(Looper.java:313)
    at android.os.HandlerThread.run(HandlerThread.java:67)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions