问题描述
我尝试使用 Xamarin Essential API 来选择和显示单个联系人。不幸的是,一旦我从模拟器中选择了一个联系人,应用程序就会进入后台。尝试从应用仪表板中选择应用时,它返回到其第一页。
此外,在联系人窗口中,如果我按下后退按钮(硬件后退按钮或导航栏中的那个),应用程序会崩溃。 因此,无论哪种方式,我都无法访问正在显示的联系人。
令人惊讶的是,当我设置断点时,我可以看到选定的联系人进来。我可以看到所有数据。
我使用的是 MvvmCross,我的参考点是 James Montemagno 的最新 Xamarin.Essential Contact API 视频和 Contacts API Xamarin.Forms 文档。
这是我的文件:
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",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,grantResults);
}
protected override void OnResume()
{
base.OnResume();
Xamarin.Essentials.Platform.OnResume();
}
protected override void OnPause()
{
base.OnPause();
}
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}"/>
在尝试从任何此类本机/系统定义的应用程序导航回 Xamarin.Forms 应用程序时,是否有人遇到过这种崩溃或一般的崩溃问题?
这是应用程序的输出:
[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,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,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,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,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,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,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,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,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,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,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.
解决方法
总代码:
public partial class MainPage : ContentPage,INotifyPropertyChanged
{
public Command SelectSingleContactCommand
{
get
{
return new Command(val =>
{
OnSelectSingleContactSelected();
});
}
}
private bool _isSingleContactRequired;
public bool IsSingleContactRequired
{
get
{
return _isSingleContactRequired;
}
set
{
if (_isSingleContactRequired != value)
{
_isSingleContactRequired = value;
NotifyPropertyChanged("IsSingleContactRequired");
}
}
}
private string _contactInformation;
public string ContactInformation
{
get
{
return _contactInformation;
}
set
{
if (_contactInformation != value)
{
_contactInformation = value;
NotifyPropertyChanged("ContactInformation");
}
}
}
public MainPage()
{
InitializeComponent();
this.BindingContext = this;
}
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);
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
}
截图:
,好吧,经过几个月的零星和频繁的检查,经过大量的代码更改和大修,在 MainActivity 文件中发现了问题。
应该从 MainActivity.cs 中删除“NoHistory = true”,否则一旦应用程序进入后台,它就会删除您活动的所有历史记录,您将无法返回!因此应用程序崩溃(或者你可以说它进入后台,当你尝试从最近打开它时,你会得到第一个活动/屏幕/视图模型)!
这么简单的办法解决这个缺陷,我哭笑不得!
P.S :这解决了所有图像选取、文件选取和联系人选取的崩溃问题!
干杯!