(一)連結|簡單界面
(二)串接第三方 api
FB
(三)簡單伺服器接收帳密資訊
跟著動手做基本上都做得出來,只是 ...(咦?
使用第三方程式,基本上都要先到該開發者網頁去申請一個 application,透過這個 application 才能夠進一步使用他們的 API 唷~
startActivityForResult
出去,這時需要到 onActivityResult
去接收這個 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())
}
}
Google
還要輕鬆一點~照著做沒遇到問題startActivityForResult
的方式,而是按下按鈕之後會發出一個 FacebookCallback
,如果 callback 成功的話,那就表示有登入成功,就到 onSuccess
去實作登入之後想做的事情即可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 按鈕
就算都有參考文章可以看,但就算如此當時還是卡在一些小坑兩三天 ... 蒸蚌。
實作 Google login 卡在 Exception 12501
?
這個的意思表示 user 自行在登入的時候取消登入過程,這讓我 ... 覺得匪夷所思,我只是按個按鈕,哪來取消登入QQ
後來才發現,原來我手機背景的 google 帳號不知為何當掉了 ... 也就是我無法直接登入其他 google
的 app,解決辦法就是把原先手機的帳號刪除,就成功了 ...
如果有遇到類似問題,不妨去手機的設定,把個人帳戶登出或者刪除,再試看看。
找不到 SHA-1 如何產生
keytool -list -v -keystore ~/.android/debug.keystore