我能够在我的Xamarin.Forms / Xamarin.Android应用中使用NuGet包Xamarin.GooglePlayServices.Auth(v60.1142.1)实施Google登录。 首次使用帐户弹出式窗口进行初始登录(请参阅LoginAsync()),然后在我的Xamarin.Forms App.cs中使用静默登录(请参见SilentLoginAsync())启动应用程序上的以下登录。但是,几分钟后,当我再次打开应用程序时,它立即崩溃了。我只看到启动屏幕一秒钟,然后崩溃了。我确定这与静默登录有关。
有什么想法吗?我也有一个问题,为什么Xamarin.Android中无法使用GoogleSignIn.getLastSignedInAccount(context)。似乎整个GoogleSignIn类都不见了。
public async Task<bool> SilentLoginAsync()
{
//TODO: check why GoogleSignIn.getLastSignedInAccount(context) != null; does not work in Xamarin
// it probably crashes here!
var result = await Auth.GoogleSignInApi.SilentSignIn(apiClient).AsAsync<GoogleSignInResult>();
signInAccount = result.SignInAccount;
return result.IsSuccess && result.SignInAccount != null;
}
public Task<bool> LoginAsync()
{
var tcs = new TaskCompletionSource<bool>();
var googleCallback = new GoogleCallback()
{
HandleSuccess = (GoogleSignInResult loginResult) =>
{
signInAccount = loginResult.SignInAccount;
tcs.SetResult(true);
},
HandleCancel = () => tcs.SetCanceled(),
};
MainActivity.CurrentActivity.GoogleCallbackManager.Callback = googleCallback;
var signInIntent = Auth.GoogleSignInApi.GetSignInIntent(apiClient);
MainActivity.CurrentActivity.StartActivityForResult(signInIntent, RC_SIGN_IN);
return tcs.Task;
}
编辑
我在logcat中看到的异常如下:
Xamarin caused by: android.runtime.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object
Xamarin.Forms.Platform.Android.AppCompat.Platform.LayoutRootPage(Page page, int width, int height)<7999cc4bd5664eca8a72469344172ca3>:0
Xamarin.Forms.Platform.Android.AppCompat.Platform.Xamarin.Forms.Platform.Android.IPlatformLayout.OnLayout(bool changed, int l, int t, int r, int b)<7999cc4bd5664eca8a72469344172ca3>:0
Xamarin.Forms.Platform.Android.PlatformRenderer.OnLayout(bool changed, int l, int t, int r, int b)<7999cc4bd5664eca8a72469344172ca3>:0
Android.Views.ViewGroup.n_OnLayout_ZIIII(IntPtr jnienv, IntPtr native__this, bool changed, int l, int t, int r, int b)<ff199c98c3f84852925dd37a0ef6113a>:0
at (wrapper dynamic-method) System.Object.9f75f64b-ae6a-4c2f-a4a8-9e33dca4e092(intptr,intptr,bool,int,int,int,int)
md5b60ffeb829f638581ab2bb9b1a7f4f3f.PlatformRenderer.n_onLayout(Native Method)
md5b60ffeb829f638581ab2bb9b1a7f4f3f.PlatformRenderer.onLayout()PlatformRenderer.java:63
android.view.View.layout()View.java:19659
android.view.ViewGroup.layout()ViewGroup.java:6075
android.widget.RelativeLayout.onLayout()RelativeLayout.java:1083
android.view.View.layout()View.java:19659
android.view.ViewGroup.layout()ViewGroup.java:6075
android.widget.FrameLayout.layoutChildren()FrameLayout.java:323
android.widget.FrameLayout.onLayout()FrameLayout.java:261
android.view.View.layout()View.java:19659
android.view.ViewGroup.layout()ViewGroup.java:6075
android.widget.LinearLayout.setChildFrame()LinearLayout.java:1791
android.widget.LinearLayout.layoutVertical()LinearLayout.java:1635
android.widget.LinearLayout.onLayout()LinearLayout.java:1544
android.view.View.layout()View.java:19659
android.view.ViewGroup.layout()ViewGroup.java:6075
android.widget.FrameLayout.layoutChildren()FrameLayout.java:323
android.widget.FrameLayout.onLayout()FrameLayout.java:261
com.android.internal.policy.DecorView.onLayout()DecorView.java:761
android.view.View.layout()View.java:19659
android.view.ViewGroup.layout()ViewGroup.java:6075
android.view.ViewRootImpl.performLayout()ViewRootImpl.java:2496
android.view.ViewRootImpl.performTraversals()ViewRootImpl.java:2212
android.view.ViewRootImpl.doTraversal()ViewRootImpl.java:1392
android.view.ViewRootImpl$TraversalRunnable.run()ViewRootImpl.java:6752
android.view.Choreographer$CallbackRecord.run()Choreographer.java:911
android.view.Choreographer.doCallbacks()Choreographer.java:723
android.view.Choreographer.doFrame()Choreographer.java:658
android.view.Choreographer$FrameDisplayEventReceiver.run()Choreographer.java:897
android.os.Handler.handleCallback()Handler.java:790
android.os.Handler.dispatchMessage()Handler.java:99
android.os.Looper.loop()Looper.java:164
android.app.ActivityThread.main()ActivityThread.java:6494
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run()RuntimeInit.java:438
com.android.internal.os.ZygoteInit.main()ZygoteInit.java:807
编辑2:
App.xaml.cs
public partial class App : Application
{
public App()
{
InitializeComponent();
}
public async Task StartAsync()
{
if (await GoogleAccount.SilentLoginAsync())
{
MainPage = new MainPage();
}
else
{
MainPage = new NavigationPage(new LoginPage { ViewModel = new LoginViewModel() });
}
}
protected async override void OnStart()
{
OnResume();
await StartAsync();
}
// ...
}