xamarin / Essentials

Xamarin.Essentials is no longer supported. Migrate your apps to .NET MAUI, which includes Maui.Essentials.
https://aka.ms/xamarin-upgrade
Other
1.52k stars 505 forks source link

[Bug] Android Crash when open browser with Browser.OpenAsync() #2079

Open TranTrieuLamQuynh opened 1 year ago

TranTrieuLamQuynh commented 1 year ago

Description

Steps to Reproduce

I have a problem when open custom tab with Browser.OpenAsync(). But it is very difficult to reproduce. But happens a lot with users. We can only investigate through the AppCenter log. Has anyone had the same problem as me? Or does anyone have a workaround for this? Thanks for the help.

Expected Behavior

Browser.OpenAsync() not crash

Actual Behavior

Browser.OpenAsync() crash in CustomTabsIntent.LaunchUrl()

Basic Information

Log crash:

android.os.RemoteException: Remote stack trace: com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPermission ActivityStackSupervisor.java:2074 com.android.server.am.ActivityStarter.startActivity ActivityStarter.java:1011 com.android.server.am.ActivityStarter.startActivity ActivityStarter.java:648 com.android.server.am.ActivityStarter.startActivityMayWait ActivityStarter.java:1645 com.android.server.am.ActivityStarter.execute ActivityStarter.java:589 JniEnvironment+InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue args) JniPeerMembers+JniInstanceMethods.InvokeAbstractVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue parameters) CustomTabsIntent.LaunchUrl (Android.Content.Context context, Android.Net.Uri url) Browser.PlatformOpenAsync (System.Uri uri, Xamarin.Essentials.BrowserLaunchOptions options) Browser.OpenAsync (System.Uri uri, Xamarin.Essentials.BrowserLaunchOptions options) Browser.OpenAsync (System.String uri, Xamarin.Essentials.BrowserLaunchOptions options) Browser.OpenAsync (System.String uri, Xamarin.Essentials.BrowserLaunchMode launchMode) BrowserHelper.OpenAsync (System.String uri) MessageDetailViewModel.OnExecuteMoreInformationCommandAsync (System.Object obj) AsyncMethodBuilderCore+<>c.b7_0 (System.Object state) SyncContext+<>c__DisplayClass2_0.b0 () Thread+RunnableImplementor.Run () IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) android.os.Parcel.createException Parcel.java:1950 android.os.Parcel.readException Parcel.java:1918 android.os.Parcel.readException Parcel.java:1868 android.app.IActivityManager$Stub$Proxy.startActivity IActivityManager.java:3608 android.app.Instrumentation.execStartActivity Instrumentation.java:1674 android.app.Activity.startActivityForResult Activity.java:4694 androidx.activity.ComponentActivity.startActivityForResult ComponentActivity.java:597 android.app.Activity.startActivityForResult Activity.java:4652 androidx.activity.ComponentActivity.startActivityForResult ComponentActivity.java:583 android.app.Activity.startActivity Activity.java:5013 androidx.core.content.ContextCompat$Api16Impl.startActivity ContextCompat.java:828 androidx.core.content.ContextCompat.startActivity ContextCompat.java:276 androidx.browser.customtabs.CustomTabsIntent.launchUrl CustomTabsIntent.java:376 crc64f839d1170f9718f6.CustomerButtonClickListener.n_onClick(Native Method) crc64f839d1170f9718f6.CustomerButtonClickListener.onClick CustomerButtonClickListener.java:30 android.view.View.performClick View.java:6637 android.view.View.performClickInternal View.java:6614 android.view.View.access$3100 View.java:790 android.view.View$PerformClick.run View.java:26201 android.os.Handler.handleCallback Handler.java:873 android.os.Handler.dispatchMessage Handler.java:99 android.os.Looper.loop Looper.java:224 android.app.ActivityThread.main ActivityThread.java:7030 java.lang.reflect.Method.invoke(Native Method) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run RuntimeInit.java:536 Caused by: android.os.RemoteException: Remote stack trace: com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPermission ActivityStackSupervisor.java:2074 com.android.server.am.ActivityStarter.startActivity ActivityStarter.java:1011 com.android.server.am.ActivityStarter.startActivity ActivityStarter.java:648 com.android.server.am.ActivityStarter.startActivityMayWait ActivityStarter.java:1645 com.android.server.am.ActivityStarter.execute ActivityStarter.java:589

MitchBomcanhao commented 1 year ago

random thought: when using Launcher.OpenAsync(uri) it is recommended to wrap it around with a check for Launcher.CanOpenAsync(uri). perhaps you need a similar check? maybe the uri you are trying to access directly in Browser.OpenAsync(uri) isn't recognised by some of your user's devices and it is blowing up?

I found that some uris would make android devices crash but they'd work fine on iOS and Windows, so there is a degree of variance that you should consider when dealing with this sort of issue.

MitchBomcanhao commented 1 year ago

as a follow-up to my previous comment, I've found that sometimes Lancher.CanOpenAsync would return false even though the launcher.OpenAsync worked just fine, so I ended up replacing CanOpenAsync with a try/catch. This fault became apparent when the device had more than one application that could open the uri and CanOpenAsync no longer worked as expected.