close

今天我們來說說 Google 登入的 sdk 怎麼用吧
現在大部份的 app 都需要這個功能了
使用者懶得輸入帳號密碼
只需一個鍵就可以登入各式 app
( 哇~~~怎麼這麼方便 )
也因此導致大部份的 app 都支援 Google login

 

所以今天我們要來研究看看這個功能要怎麼實作
下面我會一步一步的實作出來
走,Let's go !!!

 

步驟是照著官網的順序來的
我們也可以先看看官方的教學內容
連結在下方

 

點我看官網教學文件

 

首先第一步就是要到 Google API Console 註冊我們的 Projdect
點我進入 Google API Console



 

最上方的下拉選單,可以選擇我們要申請的 Project
再來就是找到憑證選項
我們需要的是 OAuth 2.0 用戶端 ID



 

點擊 OAuth 2.0 用戶端 ID 後會進到下方的畫面



 

選擇 Android
輸入自訂名稱
再來的 指紋憑證 則需要用 keystore.jks 去產生
keytool -exportcert -keystore path-to-debug-or-production-keystore -list -v
這行指令我們需要修改一下,如下

keytool -exportcert -list -v -alias yourKeyStoreName -keystore /XXX/XXX/XXX.../yourKeyStoreName.jks (your path)

如此一來就可以得到自己的指紋憑證

 

還是不行嗎?點我看更詳細解說 

 

最後是 Project 的套件名稱
建立完成之後我們進行下一步

 

===============================================

 

這次我們要取得 google-services.json
首先我們要到 Google Developers 開通 Google Sign-In 的服務
點我進到Google Developers

 

 

點選 Pick a platform


 

點選 Android App



 

輸入 App 資訊



 

選擇我們要的服務
再點選 Generate configuration files
生產我們要的檔案

 


 

最後 Download 下來放進 Project 中的 app 資料夾中



 

這樣就大功告成啦
進行下一步

 

 

===============================================

到 Android Studio 中加入下列 code

1、Add the dependency to your project-level build.gradle:

classpath 'com.google.gms:google-services:3.0.0'
如下

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

 

 

2、Add the plugin to your app-level build.gradle:apply

plugin: 'com.google.gms.google-services'


第2點要注意,記得把 plugin: 'com.google.gms.google-services' 加到最下方喔
不然會發生一個錯誤

 

點我看發生的錯誤, Error:Execution failed for task ':app:processDebugGoogleServices'…

 

都好了之後我們就可以到下一步囉

 

 

===============================================

 

終於把設定都搞定了
再來是 code 的部份
在 onCreate 的地方準備好我們需要的
GoogleSignInOptions & GoogleApiClient

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GoogleSignInOptions googleSignInOptions 
          = new GoogleSignInOptions.Builder(
                  GoogleSignInOptions.DEFAULT_SIGN_IN)
          .requestEmail()
          .requestId()
          .requestProfile()
          .build();

    googleApiClient 
          = new GoogleApiClient.Builder(fragment.getContext())
          .enableAutoManage(getActivity(), this)
          .addApi(Auth.GOOGLE_SIGN_IN_API
                 , googleSignInOptions)
          .build();
}

這裡要注意,Activity 最好是 extend FragmentActivity 或是 AppCompatActivity
如果我們是想要在 Fragment 中執行 google登入 的話
只要父類 Activity 是上述兩種即可

 

如果不是的話,需要手動的去實作 GoogleApiClient connection lifecycle 喔
點我看如何實作(官方資料)

 

然後要記得先 implements 
GoogleApiClient.ConnectionCallbacks、
GoogleApiClient.OnConnectionFailedListener
這兩個必要的 interface 喔

 

再來就是 UI 了
如果想要用預設 Button 的話就用下面這個 UI元件

<com.google.android.gms.common.SignInButton
 android:id="@+id/sign_in_button"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />

<com.google.android.gms.common.SignInButton  />
此元件長這樣
The standard Google sign-in button

如果是要自訂的話,也無妨
把 Button 弄好,我們只要在 ClickListener 做事情就好了,如下

googleLoginBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
       Intent googleSignInIntent 
       = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
       startActivityForResult(googleSignInIntent
                  , ActivityNumbering.GoogleSignInRequestCode);
    }
});

上方這段 code 是讓 user 按下 Button 之後
用 Intent 去呼叫 Google Sign In
然後值會回傳到 onActivityResult

 

AcitvityNumbering.GoogleSignInRequestCode 是我們自訂的一個 int
反正就只是要一個識別碼
知道是哪個 Activity 的回傳動作而己
下面就是 Google 回傳的地方

@Override
public void onActivityResult(int requestCode, int resultCode
    , Intent data) {

    if (requestCode == 
        ActivityNumbering.GoogleSignInRequestCode) {

        GoogleSignInResult result = Auth.GoogleSignInApi
            .getSignInResultFromIntent(data);

        if (result.isSuccess()){
           GoogleSignInAccount account 
           = result.getSignInAccount();

           Logger.e("getDisplayName"+account.getDisplayName());
           Logger.e("getId"+account.getId());
           Logger.e("getEmail"+account.getEmail());
        }else{
            Logger.e("Google sign in fail");
        }
}

解釋一下上面這段 code
先確認 requestCode 是不是我們剛剛設定的
ActivityNumbering.GoogleSignInRequestCode
是的話再從 Intent 取得 result
從 result 可以得知是否登入成功

 

成功的話,就可以取得帳號資訊了
我們就可以利用這些資訊來做事情囉

 

至於如果一直登入失敗的話
這點給大家一個說明

 

點我看為什麼 GoogleSignInResult.isSuccess 一直 false

 

點我看怎麼讓本機 build 可以順利登入

 

到此為止我們的教學已經全數完畢
個人覺得是在設定方面比較複雜
初學者第一次用的話,可能要看久一點
code 的部份都滿簡單易懂的

 

祝大家都利順成功 !!!
End



資料來源:
https://console.developers.google.com/projectselector/apis/library?pli=1
https://developers.google.com/mobile/add?refresh=1
https://developers.google.com/android/guides/api-client#manually_managed_connections
https://developers.google.com/identity/sign-in/android/sign-in?configured=true


arrow
arrow
    全站熱搜

    顏澤偉 發表在 痞客邦 留言(0) 人氣()