Search code examples
c#xamarin.formsxamarin.androidcrashxamarin.essentials

App Crashing when selecting Contact (and trying to go back) using Xamarin Essential


I tried using the Xamarin Essential API to pick and display a single contact. Unfortunately, the app goes to the background as soon as I select a contact from my emulator. When trying to select the app from the app dashboard, it returns back to its first page.

Also, when in the contacts window, if I press the back button (hardware back button or the one in the navigation bar), the app crashes. So in both ways, I am not able to access the contact being displayed.

Surprisingly, when I put in breakpoints, I could see the selected contact coming in. I could see all the data.

I am using MvvmCross, and my point of reference was James Montemagno's latest Xamarin.Essential Contact API video and the Contacts API Xamarin.Forms documentation.

Here are my files:

MainActivity.cs

    //[Activity(Label = "Vary.Core", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
        [Activity(Label = "Vary.Core", MainLauncher = true, Theme = "@style/MainTheme", NoHistory = true)]
        public class MainActivity : MvxFormsAppCompatActivity<Setup, Core.MvxApp, App> //MvxFormsAndroidSetup<Core.MvxApp, App> //Setup
        {
            protected override void OnCreate(Bundle savedInstanceState)
            {
                TabLayoutResource = Resource.Layout.Tabbar;
                ToolbarResource = Resource.Layout.Toolbar;
    
                base.OnCreate(savedInstanceState);
    
                Xamarin.Essentials.Platform.Init(this, savedInstanceState);
                global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
                //LoadApplication(new App());
            }
            public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
            {
                Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    
                base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            }
    
            protected override void OnResume()
            {
                base.OnResume();
    
                Xamarin.Essentials.Platform.OnResume();
            }
    
            protected override void OnPause()
            {
                base.OnPause();
            }

ContactDisplayViewModel.cs

   

  

      namespace Vary.Core.ViewModels
    {
        public class ContactDisplayViewModel : MvxViewModel
        {
            #region Private variables
            private readonly IMvxNavigationService navigationService;
            #endregion
    
            #region Properties
            private bool isSingleContactRequired;
            public bool IsSingleContactRequired
            {
                get => isSingleContactRequired;
                set
                {
                    isSingleContactRequired = value;
                    RaisePropertyChanged(() => IsSingleContactRequired);
                }
            }
    
            private string contactInformation;
            public string ContactInformation
            {
                get => contactInformation;
                set
                {
                    contactInformation = value;
                    RaisePropertyChanged(() => ContactInformation);
                }
            }
            #endregion
    
            #region Commands
            public IMvxCommand SelectSingleContactCommand => new MvxCommand(OnSelectSingleContactSelected);
            public MvxCommand DisplayAllContactsCommand => new MvxCommand(OnDisplayAllContactsSelected);
            #endregion
    
            #region Command Events
            async void OnSelectSingleContactSelected()
            {
                try
                {
                    var contact = await Contacts.PickContactAsync();
    
                    if (contact == null)
                        return;
    
                    var contactInfo = new StringBuilder();
                    contactInfo.AppendLine(contact.DisplayName);
                    contactInfo.AppendLine(contact.FamilyName);
                    contactInfo.AppendLine(contact.Emails.FirstOrDefault().ToString());
                    contactInfo.AppendLine(contact.Phones.FirstOrDefault().ToString());
    
                    IsSingleContactRequired = true;
                    ContactInformation = contactInfo.ToString();
                }
                catch(Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
            }
    
            void OnDisplayAllContactsSelected()
            {
    
            }
            #endregion
    
            #region .Ctor
            public ContactDisplayViewModel(IMvxNavigationService navigationService)
            {
                this.navigationService = navigationService;
            }
            #endregion
    
            #region Override Methods
            public override void Prepare()
            {
                base.Prepare();
    
                IsSingleContactRequired = false;
            }
            #endregion
        }
    }

ContactDisplayView.xaml

    <Button Grid.Row="0"
                            Grid.Column="0"
                            BackgroundColor="Transparent"
                            Text="Pick A Contact"
                            Command="{Binding SelectSingleContactCommand}"/>
    
                    <Label Grid.Row="1"
                           Grid.Column="1"
                           Grid.ColumnSpan="2"
                           Text="{Binding ContactInformation}"
                           TextColor="DarkOrange"
                           IsVisible="{Binding IsSingleContactRequired}"/>

Has anyone encountered this crash, or in general, any crash issue when trying to navigate back to your Xamarin.Forms app from any such native/system defined app?

Here is the application output :

    [Mono] Assembly Loader probing location: '/Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/sdks/out/android-x86-release/lib/Xamarin.Forms.Platform.Android.AppLinks.exe'.
[Mono] Assembly Loader probing location: '//Facades/Xamarin.Forms.Platform.Android.AppLinks.exe'.
[Mono] Requesting loading reference 13 (of 22) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll
[Mono] Loading reference 13 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll asmctx DEFAULT, looking for Xamarin.AndroidX.Legacy.Support.Core.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
[Mono] Assembly Ref addref Xamarin.Forms.Platform.Android[0xe64638e0] -> Xamarin.AndroidX.Legacy.Support.Core.UI[0xe6461de0]: 2
[Mono] Requesting loading reference 3 (of 4) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.AndroidX.Legacy.Support.Core.UI.dll
[Mono] Loading reference 3 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.AndroidX.Legacy.Support.Core.UI.dll asmctx DEFAULT, looking for Xamarin.AndroidX.DrawerLayout, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
[Mono] Requesting loading reference 2 (of 4) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.AndroidX.Legacy.Support.Core.UI.dll
[Mono] Loading reference 2 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.AndroidX.Legacy.Support.Core.UI.dll asmctx DEFAULT, looking for Java.Interop, Version=0.1.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065
[Mono] Assembly Ref addref Xamarin.AndroidX.Legacy.Support.Core.UI[0xe6461de0] -> Java.Interop[0xe649f180]: 21
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_static_int_method_a'.
[Mono] Probing 'java_interop_jnienv_call_static_int_method_a'.
[Mono] Found as 'java_interop_jnienv_call_static_int_method_a'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_nonvirtual_int_method_a'.
[Mono] Probing 'java_interop_jnienv_call_nonvirtual_int_method_a'.
[Mono] Found as 'java_interop_jnienv_call_nonvirtual_int_method_a'.
Thread started:  #12
[HostConnection] HostConnection::get() New Host Connection established 0xc0ada410, tid 17005
[HostConnection] HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 
[OpenGLRenderer] Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
[eglCodecCommon] setVertexArrayObject: set vao to 0 (0) 0 0
[EGL_emulation] eglCreateContext: 0xe650a220: maj 3 min 0 rcv 3
[EGL_emulation] eglMakeCurrent: 0xe650a220: ver 3 0 (tinfo 0xbe49d190)
[Gralloc3] mapper 3.x is not supported
[HostConnection] createUnique: call
[HostConnection] HostConnection::get() New Host Connection established 0xbe2518a0, tid 17005
[HostConnection] HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 
[eglCodecCommon] allocate: Ask for block of size 0x1000
[eglCodecCommon] allocate: ioctl allocate returned offset 0x3ff24c000 size 0x2000
[Mono] Requesting loading reference 8 (of 9) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Vary.Core.Android.dll
[Mono] Loading reference 8 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Vary.Core.Android.dll asmctx DEFAULT, looking for Xamarin.Forms.Platform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null
[Mono] Assembly Ref addref Vary.Core.Android[0xe64538c0] -> Xamarin.Forms.Platform[0xe64639a0]: 3
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_nonvirtual_float_method_a'.
[Mono] Probing 'java_interop_jnienv_call_nonvirtual_float_method_a'.
[Mono] Found as 'java_interop_jnienv_call_nonvirtual_float_method_a'.
[EGL_emulation] eglMakeCurrent: 0xe650a220: ver 3 0 (tinfo 0xbe49d190)
[eglCodecCommon] setVertexArrayObject: set vao to 0 (0) 1 0
[Mono] Requesting loading reference 11 (of 22) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll
[Mono] Loading reference 11 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll asmctx DEFAULT, looking for Xamarin.AndroidX.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
[Mono] Assembly Ref addref Xamarin.Forms.Platform.Android[0xe64638e0] -> Xamarin.AndroidX.Core[0xe6461900]: 7
[Mono] Requesting loading reference 16 (of 22) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll
[Mono] Loading reference 16 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll asmctx DEFAULT, looking for Xamarin.AndroidX.SwipeRefreshLayout, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
[Mono] Assembly Ref addref Xamarin.Forms.Platform.Android[0xe64638e0] -> Xamarin.AndroidX.SwipeRefreshLayout[0xe6463040]: 2
[Mono] Requesting loading reference 3 (of 4) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.AndroidX.SwipeRefreshLayout.dll
[Mono] Loading reference 3 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.AndroidX.SwipeRefreshLayout.dll asmctx DEFAULT, looking for Xamarin.AndroidX.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
[Mono] Assembly Ref addref Xamarin.AndroidX.SwipeRefreshLayout[0xe6463040] -> Xamarin.AndroidX.Core[0xe6461900]: 8
[Mono] Requesting loading reference 2 (of 4) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.AndroidX.SwipeRefreshLayout.dll
[Mono] Loading reference 2 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.AndroidX.SwipeRefreshLayout.dll asmctx DEFAULT, looking for Java.Interop, Version=0.1.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065
[Mono] Assembly Ref addref Xamarin.AndroidX.SwipeRefreshLayout[0xe6463040] -> Java.Interop[0xe649f180]: 22
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_static_void_method_a'.
[Mono] Probing 'java_interop_jnienv_call_static_void_method_a'.
[Mono] Found as 'java_interop_jnienv_call_static_void_method_a'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_float_method_a'.
[Mono] Probing 'java_interop_jnienv_call_float_method_a'.
[Mono] Found as 'java_interop_jnienv_call_float_method_a'.
2021-03-05 03:03:56 [TRACE] (MvxForms) PresentationAttribute not found for ContactDisplayViewModel. Assuming ContentPage presentation
2021-03-05 03:03:56 [TRACE] (MvvmCross.Logging.MvxLog) No view model association found for candidate view MainActivity
2021-03-05 03:03:56 [TRACE] (MvvmCross.Logging.MvxLog) No view model association found for candidate view MainActivity
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_is_assignable_from'.
[Mono] Probing 'java_interop_jnienv_is_assignable_from'.
[Mono] Found as 'java_interop_jnienv_is_assignable_from'.
Resolved pending breakpoint at 'ContactDisplayViewModel.cs:67,1' to void Vary.Core.ViewModels.ContactDisplayViewModel.<OnSelectSingleContactSelected>d__13.MoveNext () [0x0015b].
[Mono] Requesting loading reference 5 (of 8) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Essentials.dll
[Mono] Loading reference 5 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Essentials.dll asmctx DEFAULT, looking for System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
[Mono] Assembly Ref addref Xamarin.Essentials[0xe64636a0] -> System.Core[0xe64a0140]: 9
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_object_field'.
[Mono] Probing 'java_interop_jnienv_get_object_field'.
[Mono] Found as 'java_interop_jnienv_get_object_field'.
[EGL_emulation] eglMakeCurrent: 0xe650a220: ver 3 0 (tinfo 0xbe49d190)
[EGL_emulation] eglMakeCurrent: 0xe650a220: ver 3 0 (tinfo 0xbe49d190)
[Mono] Requesting loading reference 12 (of 22) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll
[Mono] Loading reference 12 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll asmctx DEFAULT, looking for System.Runtime.Serialization, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
[Mono] Assembly Ref addref Xamarin.Forms.Platform.Android[0xe64638e0] -> System.Runtime.Serialization[0xe64a17c0]: 4
[Mono] DllImport searching in: 'libmono-native.so' ('./libmono-native.so').
[Mono] Searching for 'SystemNative_MkDir'.
[Mono] Probing 'SystemNative_MkDir'.
[Mono] Found as 'SystemNative_MkDir'.
[Mono] Requesting loading reference 21 (of 22) of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll
[Mono] Loading reference 21 of /storage/emulated/0/Android/data/com.vinayakjuneja.vary/files/.__override__/Xamarin.Forms.Platform.Android.dll asmctx DEFAULT, looking for System.Xml, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
[Mono] Assembly Ref addref Xamarin.Forms.Platform.Android[0xe64638e0] -> System.Xml[0xe64a16a0]: 7
[System] A resource failed to call close. 
[System] A resource failed to call close. 

Solution

  • Well, after months of sporadic and frequent checks, after tons of code changes and overhauls, the problem was found in the MainActivity file.

    The "NoHistory = true" should be removed from MainActivity.cs, else as soon as the app goes into background, it deletes all history of your activity and you have nothing to come back to! Hence the app crash (or you can say it goes into the background, and when you try to open it from the recents, you get the first activity/scree/view model)!

    Such a simple solution for this defect, I am crying and laughing at the same time!

    P.S : This solves all crash issues for Image picking, File picking and Contact picking!

    Cheers!