前言
本文主要闡述了Google 登錄以及Android 接入遇到的一些常見問題添吗,Google 登錄主要分為兩步走演怎,第一步呢瘟栖,是Google 登錄配置方法横蜒,這邊就不再進(jìn)行闡述糊渊,有需要的闊以參考一下另一篇文檔Android Google SignIn配置問題右核,第二部就是本文將要講的,將Google 登錄集成到Android內(nèi)渺绒。
準(zhǔn)備工作
1.配置完成Google 登錄環(huán)境(Android Google SignIn配置問題)
2.準(zhǔn)備一部支付Google 服務(wù)的手機(jī)(Google 服務(wù)三件套)
官方文檔:Google SigIn
官方Demo:Google SigIn Demo
配置環(huán)境:Android Google SignIn配置問題
流程圖
引入Apk
在項(xiàng)目級下Build.grade
中添加
allprojects {
repositories {
google()
}
}
然后贺喝,在應(yīng)用級下 Build.grade中添加
apply plugin: 'com.android.application'
...
dependencies {
implementation 'com.google.android.gms:play-services-auth:19.0.0'
}
添加 Google SignIn Button
在google的Api里有這么一個(gè)Google Sign Button
原生的闊以使用,你闊以修改對應(yīng)樣式宗兼,間距等躏鱼。當(dāng)然也可以不使用這個(gè)控件,自己寫一個(gè)控件也是可以的殷绍,沒有印象的染苛。
<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints" />
配置 Google SigIn Client
在Activity的onCreate()
中進(jìn)行初始化,配置Google 登錄用以請求用戶的Email主到,Id以及個(gè)人信息殖侵,請求的需要IdToken作為請求依據(jù)。
private var gso: GoogleSignInOptions? = null
private var mGoogleSignClient: GoogleSignInClient? = null
fun initGoogleClient() {
gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail() //指定您的應(yīng)用程序請求電子郵件信息
.requestId() //指定您的應(yīng)用程序請求用戶標(biāo)識
.requestIdToken("1033370260928-ju6f2shsld313g8o37s8phvkg2nc947o.apps.googleusercontent.com") //指定請求用于身份驗(yàn)證用戶的ID令牌
.requestProfile() //指定您的應(yīng)用程序請求用戶的個(gè)人資料信息
.build()
//使用gso指定的選項(xiàng)構(gòu)建一個(gè)GoogleSignInClient
mGoogleSignClient = GoogleSignIn.getClient(activity, gso!!)
}
注:
IdToken
是配置環(huán)境里面的WebClient
的Id镰烧,不要填寫錯(cuò)誤拢军,如果不填寫,或者填寫錯(cuò)誤怔鳖,會報(bào)error10的錯(cuò)誤茉唉,并且點(diǎn)擊Google SigIn Button
的時(shí)候?qū)霈F(xiàn)閃屏的現(xiàn)象。
開始登錄
在點(diǎn)擊事件中使用此方法,通過使用方法調(diào)起Google SigIn頁面如圖G
private var requestCode =10
fun login() {
val intent = mGoogleSignClient?.signInIntent
activity.startActivityForResult(intent, requestCode)
}
配置Google 回調(diào)方法
用戶登錄后度陆,通過活動的onActivityResult
方法為該用戶獲取一個(gè)對象艾凯,對象中包含請求回來的信息。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == GoogleLoginUtil.requestCode) {
val googleResultTask = GoogleSignIn.getSignedInAccountFromIntent(data)
googleLoginUtil?.handleSignInResult(googleResultTask)
}
}
Google 回調(diào)方法處理
1.提取用戶信息
該GoogleSignInAccount
對象包含有關(guān)已登錄用戶的信息懂傀,例如用戶趾诗,id等一些信息,通過getRsult()
提取出來即可蹬蚁。
fun handleSignInResult(completedTask: Task<GoogleSignInAccount>) {
try {
val account = completedTask.getResult(ApiException::class.java)
val displayName = account?.displayName
val email = account?.email
val id = account?.id
val idToken = account?.idToken
Log.e(tag, "google-displayName:${displayName},googleEmail:${email},googleId:${id},googleIdToken:${idToken}")
googleLoginSuccess(id, email) //將獲取數(shù)據(jù)傳入
} catch (e: ApiException) {
when (e.statusCode) {
error_7 -> { Log.e(tag, "網(wǎng)絡(luò)不給力恃泪,請?jiān)僭囈淮?)}
error_12500 -> {Log.e(tag, "當(dāng)前設(shè)備不支持")}
requestCode -> { Log.e(tag, "環(huán)境配置步錯(cuò)誤,請稍后再試")}
}
Log.e(tag, "googleLoginFailed${e.statusCode}")
}
}
2.傳入用戶信息
將獲取到的用戶信息犀斋,傳給后端
注:Google帳戶的電子郵件地址可以更改贝乎,因此不能使用它來識別用戶,推薦使用帳戶的ID叽粹。
fun googleLoginSuccess(id: String?, email: String?) {
//將id和email傳入后端
//·······
}
退出登錄
在退出登錄之前览效,需要判斷一下當(dāng)前用戶是否使用Google SigIn登錄的,找到此用戶將用戶與當(dāng)前設(shè)備取消關(guān)聯(lián)虫几,便于下次登錄的時(shí)候重新登錄新的用戶锤灿。
fun logout(context: Context) {
val account = GoogleSignIn.getLastSignedInAccount(context)
if (account == null) {
Log.e(tag, "已經(jīng)登出")
} else {
mGoogleSignClient?.signOut()
?.addOnCompleteListener {
Log.e(tag, "成功登出")
}
?.addOnFailureListener {
Log.e(tag, "登出失敗,請稍后再試")
}
}
}
總結(jié)
Android 接入Google 登錄流程比較簡單辆脸,比較難在Google 配置環(huán)境但校,環(huán)境配置不成功,導(dǎo)致很多錯(cuò)誤每强。Android 接入成功后,同時(shí)也需要將App上傳到Google console上的內(nèi)部測試中州刽,進(jìn)行調(diào)試才可以空执。