capacitor-plugins
capacitor-plugins copied to clipboard
[@capacitor/camera] - Android - RuntimeException: java.lang.reflect.InvocationTargetException
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)
We can also observe this on some devices in
OS version: android13 Model:Redmi Note 11 Pro
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
This is happening here too. Any solutions?
It also happens to me, any update?
This is happening here too. Any solutions?
Bumping this a bit – still seeing it regularly with no distinct pattern or ways to consistently reproduce.