iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
1
自我挑戰組

學習 Android Kotlin 隨筆系列 第 3

[ Day 3 ] 上線~Android 新手登入囉!(二)串接 FB 、Google 登入

| 登入

  • (一)連結|簡單界面

  • (二)串接第三方 api

    • FB

    • Google

  • (三)簡單伺服器接收帳密資訊

| 實作概念

跟著動手做基本上都做得出來,只是 ...(咦?
使用第三方程式,基本上都要先到該開發者網頁去申請一個 application,透過這個 application 才能夠進一步使用他們的 API 唷~

  • 連結 | Google 登入 DIY
    • 當登入的按鈕被按下去之後,會做一些帳戶的設定並且發一個 startActivityForResult 出去,這時需要到 onActivityResult 去接收這個 result。
      如果成功,可以在接收 result 之後去做一些設定,因為 Google 只有提供登入按鈕,沒有提供登入按鈕,這邊我只有簡單的用一個 button 去代替,當然可以模仿 Google 提供的按鈕樣式 [1]
    • 登入之後,可以藉著回傳的 result 得到該帳號的很多資訊唷~
    • 下方程式碼的主要處理了登入以及登出按鈕,登出之後會把自己隱藏,並且顯示登入鈕,反之亦然
      fun googleLogin(view : View){
          val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                  .requestEmail()
                  .build()
              val signInButton = view.Google_login_button
              val signOutButton = view.Google_logout_button
              val serverClientId = getString(R.string.server_client_id)
              val mGoogleSignInClient = GoogleSignIn.getClient(context!!, gso)
              signInButton.setSize(SignInButton.SIZE_STANDARD)
              signInButton.setOnClickListener {
                  var mGoogleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                      .requestServerAuthCode(serverClientId)
                      .requestEmail()
                      .build()
                  val mgoogleApiClient = GoogleApiClient
                      .Builder(context!!)
                      .addApi(Auth.GOOGLE_SIGN_IN_API, mGoogleSignInOptions)
                      .build()
                  val signInIntent: Intent = Auth.GoogleSignInApi.getSignInIntent(mgoogleApiClient)
                  startActivityForResult(signInIntent, GOOGLE_LOGIN)
              }
      
              signOutButton.setOnClickListener {
                  mGoogleSignInClient.signOut()
                      .addOnCompleteListener {
                          view.img_lock.setImageResource(R.drawable.ic_lock_outline_black_24dp)
                          view?.Google_login_button?.visibility = View.VISIBLE
                          view?.Google_logout_button?.visibility = View.GONE
                          Toast.makeText(context, "登出 Google", Toast.LENGTH_SHORT).show()
                      }
              }
          }
      
    • 以下程式碼處理了 Google 登入成功之後,該怎麼接回傳結果
      fun googleLoginResult(data: Intent?){
          val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(data)
          Log.d("login info", data?.extras.toString())
          try {
              val account = task.getResult(ApiException::class.java)
              Toast.makeText(context, "Email: "+ account?.email?.substring(0, 3)+"XXX", Toast.LENGTH_SHORT).show()
              Toast.makeText(context, "User id: "+ account?.id?.substring(0, 3)+"XXX", Toast.LENGTH_SHORT).show()
              Toast.makeText(context, "User name: "+account?.displayName, Toast.LENGTH_SHORT).show()
              view?.img_lock?.setImageResource(R.drawable.ic_lock_open_black_24dp)
              view?.Google_login_button?.visibility = View.GONE
              view?.Google_logout_button?.visibility = View.VISIBLE
              view?.Google_logout_button?.layoutParams = view?.Google_login_button?.layoutParams
          } catch (e: ApiException) {
              Log.d("error", e.toString())
          }
      }
      
  • 連結 | FB 登入 DIY
    • 個人覺得比 Google 還要輕鬆一點~照著做沒遇到問題
    • 他不是用 startActivityForResult 的方式,而是按下按鈕之後會發出一個 FacebookCallback ,如果 callback 成功的話,那就表示有登入成功,就到 onSuccess 去實作登入之後想做的事情即可
    • 下方程式碼處理了登入後的 callback
      fun fbLogin(view :View){
          view.FB_login_button.setReadPermissions("email");
          view.FB_login_button.setFragment(this);
          view.FB_login_button.registerCallback(callbackManager, object: FacebookCallback<LoginResult> {
              override fun onError(error: FacebookException?) {
                  Toast.makeText(context, error.toString(), Toast.LENGTH_SHORT).show()
              }
      
              override fun onCancel() {
              }
      
              override fun onSuccess(result: LoginResult?) {
                  val uId: String = result!!.accessToken.userId.toString()
                  val token: String = result!!.accessToken.token.toString()
                  view.img_lock.setImageResource(R.drawable.ic_lock_open_black_24dp)
                  Toast.makeText(context, "user id: "+ result!!.accessToken.userId.toString().substring(0,4) + "XXX 登入", Toast.LENGTH_SHORT).show()
              }
          })
      }
      
      

[1] 連結 | Google 按鈕

| 實作小泥坑

就算都有參考文章可以看,但就算如此當時還是卡在一些小坑兩三天 ... 蒸蚌。

  1. 實作 Google login 卡在 Exception 12501

    這個的意思表示 user 自行在登入的時候取消登入過程,這讓我 ... 覺得匪夷所思,我只是按個按鈕,哪來取消登入QQ
    後來才發現,原來我手機背景的 google 帳號不知為何當掉了 ... 也就是我無法直接登入其他 google 的 app,解決辦法就是把原先手機的帳號刪除,就成功了 ...
    如果有遇到類似問題,不妨去手機的設定,把個人帳戶登出或者刪除,再試看看。

  2. 找不到 SHA-1 如何產生

    keytool -list -v -keystore ~/.android/debug.keystore
    

上一篇
[ Day 2 ] 上線~Android 新手登入囉!(一)實做簡易登入
下一篇
[ Day 4 ] 上線~Android 新手登入囉!(三)用 Retrofit 來使喚我的伺服器僕人
系列文
學習 Android Kotlin 隨筆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言