私の現在のプロジェクトでは、チーム メンバーの 1 人が Xamarin.Android アプリに Google サインインを実装しました。彼はキーストアと sha もリリース用に追加しました。そして、デバッグモードの彼のマシンで正常に動作しています。
しかし、自分のマシンからこのコードを実行しようとすると、常にResultCode Result.Canceled OnActivityResult of activity を取得します
これは私のAndroidレンダラーのコードです:
public class GoogleLoginRendere : PageRenderer,
GoogleApiClient.IOnConnectionFailedListener, Android.Views.View.IOnClickListener
{
GoogleApiClient mGoogleApiClient;
MainActivity activity;
SignInButton signInButton;
Android.Widget.Button btn;
public GoogleLoginRendere()
{
}
public void OnConnectionFailed(ConnectionResult result)
{
throw new NotImplementedException();
}
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
base.OnElementChanged(e);
activity = Context as MainActivity;
if (e.OldElement != null)
{
activity.ActivityResult -= HandleActivityResult;
}
if (e.NewElement != null)
{
activity.ActivityResult += HandleActivityResult;
}
btn = new Android.Widget.Button(activity);
btn.Text = "Google SignIn";
signInButton = new SignInButton(activity);
signInButton.SetSize(SignInButton.SizeStandard);
signInButton.Visibility = ViewStates.Visible;
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
.RequestEmail()
.Build();
mGoogleApiClient = new GoogleApiClient.Builder(activity)
.EnableAutoManage(activity /* FragmentActivity */, this /* OnConnectionFailedListener */)
.AddApi(Auth.GOOGLE_SIGN_IN_API, gso)
.Build();
FrameLayout.LayoutParams linLayoutParam = new FrameLayout.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent);
linLayoutParam.Gravity = GravityFlags.Center;
activity.AddContentView(btn, linLayoutParam);
btn.SetOnClickListener(this);
/* signInButton.Click += (sender, ex) =>
{
Console.WriteLine(string.Format("Click called"));
Intent signInIntent = Auth.GoogleSignInApi.GetSignInIntent(mGoogleApiClient);
activity.StartActivityForResult(signInIntent, 0);
};*/
MessagingCenter.Subscribe<object, string>(this, "CallLogout", (sender, msg) =>
{
Auth.GoogleSignInApi.SignOut(mGoogleApiClient);
signInButton.Visibility = ViewStates.Visible;
});
}
private void HandleActivityResult(object sender, ActivityResultEventArgs e)
{
Console.WriteLine(string.Format("renderer called"));
if (e.RequestCode == 0)
{
GoogleSignInResult result = Auth.GoogleSignInApi.GetSignInResultFromIntent(e.Data);
if (result.IsSuccess)
{
signInButton.Visibility = ViewStates.Invisible;
User aUser = new User();
aUser.Email = result.SignInAccount.Email;
App.appUser = aUser;
MessagingCenter.Send<object, string>(this, "callLoginWebservice", "callLoginWebservice");
}
else
{
Toast.MakeText(activity, "email not found", ToastLength.Long).Show();
Auth.GoogleSignInApi.SignOut(mGoogleApiClient);
signInButton.Visibility = ViewStates.Visible;
}
}
}
public void OnClick(Android.Views.View v)
{
var signInIntent = Auth.GoogleSignInApi.GetSignInIntent(mGoogleApiClient);
activity.StartActivityForResult(signInIntent, 0);
//Intent signInIntent = Auth.GoogleSignInApi.GetSignInIntent(mGoogleApiClient);
//((MainActivity)Forms.Context).StartActivityForResult(signInIntent, 1);
//mGoogleApiClient.Connect();
}
}
MainActivity.cs
public class ActivityResultEventArgs : EventArgs
{
public int RequestCode { get; set; }
public Result ResultCode { get; set; }
public Intent Data { get; set; }
public ActivityResultEventArgs() : base()
{ }
}
[Activity(Label = "AppName.Droid", Icon = "@drawable/icon", Theme = "@style/MyTheme", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public event EventHandler<ActivityResultEventArgs> ActivityResult = delegate { };
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
App.ServiceManager = new SoapServiceManager(new SoapService());
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
Console.WriteLine(string.Format("Main activity result called"));
GoogleSignInResult result = Auth.GoogleSignInApi.GetSignInResultFromIntent(data);
if (result != null)
{
if (result.IsSuccess)
{
Console.WriteLine(string.Format("Activity result is {0}", result.SignInAccount.Email));
}
else
{
Console.WriteLine(string.Format("Activity result is {0}", resultCode));
}
}
ActivityResult(this, new ActivityResultEventArgs
{
RequestCode = requestCode,
ResultCode = resultCode,
Data = data
});
}
}
コードに問題がないことはわかっています。構成に問題があるはずです。だから私がまだ試したことは
=> SSH-1 キーを生成し、Google サインイン アカウントに追加し、google-services.json を置き換えました
=> アカウントのプロジェクトにも新しい Google サインを作成しようとしました。アプリの配布で生成される新しいキーストアを使用します。
何も機能しませんでした。それでも同じエラーが発生します。
PS:重複した回答としてマークしないでください。他のすべての質問を検索し、R&D に 2 日間の時間を費やしましたが、解決策が見つかりませんでした。 この質問は私のようです。 しかし、それはアンドロイドスタジオのJavaアンドロイド用です。そのため、記載されているすべてのファイルが Xamarin.Android ソリューションにあるわけではありません。
誰かがアイデアを持っているなら。助けて。