capacitor-plugins icon indicating copy to clipboard operation
capacitor-plugins copied to clipboard

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

Open ssnielsen opened this issue 1 year ago • 4 comments

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)

ssnielsen avatar Aug 16 '24 08:08 ssnielsen

We can also observe this on some devices in

OS version: android13 Model:Redmi Note 11 Pro

selcuk-sahin avatar Aug 24 '24 11:08 selcuk-sahin

We are also having this show up on Firebase for line 398:

       at com.capacitorjs.plugins.camera.CameraPlugin.lambda$openPhotos$4(CameraPlugin.java:398)
       at com.capacitorjs.plugins.camera.CameraPlugin.$r8$lambda$Q3Zoqvz-mhUyhE9-PCNGiU94zSE()
       at com.capacitorjs.plugins.camera.CameraPlugin$$ExternalSyntheticLambda4.onActivityResult(:6)
       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:389)
       at com.capacitorjs.plugins.camera.CameraPlugin.openPhotos(CameraPlugin.java:319)
       at com.capacitorjs.plugins.camera.CameraPlugin.lambda$showPrompt$0(CameraPlugin.java:177)
       at com.capacitorjs.plugins.camera.CameraPlugin.$r8$lambda$7r8JnyAajpgfsettGJXQ3yH3ntU()
       at com.capacitorjs.plugins.camera.CameraPlugin$$ExternalSyntheticLambda5.onSelected(:4)
       at com.capacitorjs.plugins.camera.CameraBottomSheetDialogFragment.lambda$setupDialog$0(CameraBottomSheetDialogFragment.java:103)
       at com.capacitorjs.plugins.camera.CameraBottomSheetDialogFragment.$r8$lambda$mwnP0zJKQebo3xCPcX1ghp_1z9M()
       at com.capacitorjs.plugins.camera.CameraBottomSheetDialogFragment$$ExternalSyntheticLambda0.onClick(:4)
       at android.view.View.performClick(View.java:8160)
       at android.widget.TextView.performClick(TextView.java:16222)
       at android.view.View.performClickInternal(View.java:8137)
       at android.view.View.access$3700(View.java:888)
       at android.view.View$PerformClick.run(View.java:30236)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:246)
       at android.app.ActivityThread.main(ActivityThread.java:8625)
       at java.lang.reflect.Method.invoke(Method.java)

Null checks like onDestroy would probably solve the issue. I can open a PR if that would help

ekchatzi avatar Sep 30 '24 18:09 ekchatzi

This is happening here too. Any solutions?

gcarpi avatar Nov 08 '24 20:11 gcarpi

It also happens to me, any update?

luisbytes avatar May 04 '25 16:05 luisbytes

This is happening here too. Any solutions?

ModestinoAndre avatar Jul 29 '25 11:07 ModestinoAndre

Bumping this a bit – still seeing it regularly with no distinct pattern or ways to consistently reproduce.

ssnielsen avatar Nov 21 '25 09:11 ssnielsen