摘要:[Xamarin.Android] 整合Google+ 登入
如何在Xamarin中整合Google+登入?在國外網站上有為外國作者James Montemagno分享了如何在Xamarin.Android上整合Google Plus的登入方法,這邊就介紹這篇文章。
這個專案的範例程式可以在原作者的GitHub網站上下載:
https://github.com/jamesmontemagno/GooglePlusSignIn
1. 首先調整Xamarin Android專案的設定
1.1 開啓Android SDK Manager下載Google Play Service。
1.2 在使用Xamarin開發中,所有會使用到Google 的雲服務功能,無論是Google+,地圖,GCM推播,都需要去下載Google Play Service 元件。
1.3 調整專案中的Heap Size.
在專案中,選擇project properties -> Android Build -> Advanced -> Java Heap Size.在這邊調整為1G
2. 設定Google Console
在進行這一段設定之前,當然你需要有一個Google帳號。這邊就不贅述,請自行上Google網站上申請。
2.1 前往Google App Console網站建立一個Project
https://console.developers.google.com
2.2 在Google Service console網站上開啓Google plus service
2.3 取得你電腦上的SHA1指紋憑證
(在這個範例中是使用預設的Debug.keystore,如果你要發佈這個App,你必須自己建立另一個Keystore)
使用預設的debug.keystore,他的存放路徑如下:
在Mac環境中,Debug.keystore的路徑為
/Users/<UserName>/.local/share/Xamarin/Mono for Android/debug.keystore
在Windows環境中的路徑是
C:\Users\[USERNAME]\AppData\Local\Xamarin\Mono for Android\debug.keystore
可使用下列的指令列印出SHA1指紋憑證
keytool -list -v -keystore /Users/benlu/.local/share/Xamarin/Mono\ for\ Android/debug.keystore
2.4 在Google Console上面建立一個Client ID
在這個步驟特別要注意,註冊這個ID所需要的Package name與你專案中的package名稱一樣.
3. 建立Xamarin Android 專案
3.1 開啓Android專案中的Main.axml檔案,輸入底下的Xaml檔案.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:plus="http://schemas.android.com/apk/lib/com.google.android.gms.plus"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="12dp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
<Button
android:id="@+id/logout_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Logout" />
</LinearLayout>
<com.google.android.gms.plus.PlusOneButton
android:id="@+id/plus_one_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
plus:size="standard"
plus:annotation="inline"
android:layout_marginTop="12dp" />
<ImageView
android:src="@android:drawable/ic_menu_gallery"
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/profile_image"
android:layout_marginTop="12dp" />
<TextView
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/profile_name"
android:singleLine="true" />
<TextView
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/profile_nickname"
android:singleLine="true" />
<TextView
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/profile_about"
android:maxLines="3" />
</LinearLayout>
3.2 接著需要設定App整合Google+所需要的權限,這邊需要設定Internet,Get Accounts還有User Crefentials.開啓In AndroidManifest.xml,加入所需要的權限
3.3 開啓畫面MainActivity.cs檔案,建立GooglePlusClient物件,並且載入LoginButton 與 PlusOneButton:
控制項。
plusClient = new PlusClient.Builder(this, this, this).Build();
googleLoginButton = FindViewById(Resource.Id.sign_in_button);
plusOneButton = FindViewById (Resource.Id.plus_one_button);
3.4 接著來實作登入按鈕被按下的事件處理常式,這邊建立ResolveLogin這個方法與實作常式。而當建立連線後,會觸發OnActivityResult事件。
private void ResolveLogin(ConnectionResult result)
{
if (result.HasResolution) {
try {
result.StartResolutionForResult (this, REQUEST_CODE_RESOLVE_ERR);
} catch (Android.Content.IntentSender.SendIntentException e) {
plusClient.Connect ();
}
} else if(progressDialog != null && progressDialog.IsShowing) {
progressDialog.Dismiss ();
}
}
protected override void OnActivityResult (int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult (requestCode, resultCode, data);
if (requestCode != REQUEST_CODE_RESOLVE_ERR)
return;
if (resultCode == Result.Ok) {
plusClient.Connect ();
} else {
progressDialog.Dismiss ();
}
}
3.5 接著要實作兩個interface,
IGooglePlayServicesClientConnectionCallbacks, IGooglePlayServicesClientOnConnectionFailedListener.
這個範例中,在Activity Start事件與stop事件中都會嘗試連結Google plus。
public void OnConnected (Bundle p0){
progressDialog.Dismiss ();
RefreshPlusOneButton ();
UpdateProfile ();
Toast.MakeText (this, "Connected!", ToastLength.Long).Show ();
}
public void OnDisconnected (){
Toast.MakeText (this, "Disconnected!", ToastLength.Long).Show ();
}
public void OnConnectionFailed (ConnectionResult result)
{
if (progressDialog.IsShowing) {
ResolveLogin (result);
}
connectionResult = result;
Toast.MakeText (this, "Connection Failed!", ToastLength.Long).Show ();
}
3.6 在OnCreate事件中,我們也希望去對Google plus註冊與取得Callbacks
plusClient.RegisterConnectionCallbacks (this);
plusClient.IsConnectionFailedListenerRegistered (this);
3.7 在登入按鈕中,加入條件判斷式來確認當已經登入過Google Plus後,不要再重複登入.
googleLoginButton.Click += (sender, e) => {
if(plusClient.IsConnected || plusClient.IsConnecting)
return;
progressDialog.Show();
if (connectionResult == null) {
plusClient.Connect();
}
else{
ResolveLogin(connectionResult);
}
};
3.8 一旦登入後,可以取得這個使用者的登入資訊, 呈現在畫面上。
private void UpdateProfile(){
var imageView = FindViewById (Resource.Id.profile_image);
FindViewById (Resource.Id.profile_name).Text = plusClient.CurrentPerson.DisplayName;FindViewById (Resource.Id.profile_nickname).Text = plusClient.CurrentPerson.Nickname;
FindViewById (Resource.Id.profile_about).Text = plusClient.CurrentPerson.AboutMe;
imageLoader.DisplayImage (plusClient.CurrentPerson.Image.Url, imageView, Resource.Drawable.default_icon);
}
3.9 如果使用者需要登出Google Plus,我們只需要撤銷PlusClient的權限即可。
logoutButton.Click += (sender, e) => {
if(!plusClient.IsConnected || plusClient.IsConnecting)
return;
plusClient.RevokeAccessAndDisconnect(this);
};
3.10 在這個範例中,最後新增一個按鈕,當你完成登入Google Plus的時候,按下這個按鈕,
可以在Google+上帶入URL網址與分享資訊。
private void RefreshPlusOneButton ()
{
plusOneButton.Initialize ("http://blog.xamarin.com/microsoft-and-xamarin-partner-globally/", PLUS_ONE_REQUEST_CODE);
}
登入這個App,可以看見如以下的畫面,在這個App上按下紅色的Google+按鈕,會開啟帳戶選擇視窗。
這邊選擇一個你的Google+帳戶後,按下確定,登入完成後,可以看到在App中截取到我這個Google+的帳號資訊了。
參考文件:
Google+ Sign in In android application
http://forums.xamarin.com/discussion/15898/google-sign-in-in-android-application
Google Plus Services, Login and +1 in Xamarin.Android
http://motzcod.es/post/67077106339/google-plus-services-login-and-1-in-xamarin-android