Cocos Creator Android 平台 Google 原生登录
在海外項目中,我們通常需要接入 Google 帳號登錄,這樣可以提高應用使用率。
下面以 Android 平臺 接入 Google 原生登錄為例,進行詳細說明。
一、準備工作
1、需要 Android 4.4 或更高版本的兼容 Android 設備
2、需要在設備或模擬器上安裝 15.0.0 或更高版本的 Google Play 服務
3、最新版本的 Android SDK
4、配置為針對 Android 4.4 (KitKat) 或更高版本進行編譯
5、Google開發者賬號,登錄Firebase開發者后臺
二、接入步驟
第1步,設置Google API 控制臺項目
(1)、選擇國家地區,同意協議
(2)、創建或打開項目
Ps:一般在firebase創建項目后,項目會自動關聯到google api ;同時在憑據頁面會自動生成Android Client ID、Web Client ID。
如何在firebase創建項目,請查看Cocos Creator Android 平臺接入 Google Firebase (Analytics功能)
在 API 控制臺中打開項目,如果還沒有項目,請創建一個。
這里,我們直接打開firebase 自動創建的 google api 項目,如下圖所示:
(3)、憑據頁面,獲取到Web 客戶端 ID( app google sdk 初始化時使用) 、密鑰(web服務器驗證google登錄時使用)
(4)、憑據頁面,設置授權
A、依次點擊感嘆號項 ,進入下一步操作
B、選擇 Android apps
C、注冊app 項,點擊 添加 item
D、輸入 包名 、sha-1
E、保存
(4)、完善 OAuth 同意屏幕信息
A、點擊左側同意屏幕標簽,選擇外部類型
B、輸入開發者聯系郵箱
C、輸入客服郵箱
D、添加測試賬號
Google API 控制臺項目設置完成,下面添加依賴項。
第2步,添加依賴項
(1)、在項目根目錄 (Project) build.gradle 中添加 google()
確保buildscript和allprojects 部分中都包含 Google 的 Maven 存儲庫() 。
buildscript {repositories {google()mavenCentral()}... } allprojects {repositories {google()mavenCentral()jcenter() } }(2)、在 app 級 build.gradle 中添加庫
implementation 'com.google.android.gms:play-services-auth:19.2.0'(3)、java 代碼實現 google 登錄封裝
package org.cocos2dx.javascript.tools;import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.util.Log;import com.google.android.gms.auth.api.signin.GoogleSignIn; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.android.gms.auth.api.signin.GoogleSignInClient; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.tasks.Task;import org.cocos2dx.javascript.Native;import java.util.HashMap; import java.util.Map;public class GoogleUtils {private String m_actTag ="GoogleUtils";private String m_googleLoginCallBack="";private String client_id = "";private Activity m_activity=null;private static final int SIGN_LOGIN = 901;private GoogleSignInClient mGoogleSignInClient;private static GoogleUtils g_Instace = null;public static GoogleUtils getInstance() {if (null == g_Instace) {g_Instace = new GoogleUtils();}return g_Instace;}public Intent getGoogleIntent() {Intent signInInten;signInInten = mGoogleSignInClient.getSignInIntent();return signInInten;}public void onActivityResult(int requestCode, int resultCode, Intent data) {if(mGoogleSignInClient != null) {switch (requestCode) {case SIGN_LOGIN:Log.d(m_actTag,"setActivityResultGoogle");Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);if (task == null) {Log.d(m_actTag,"task:null");}try {GoogleSignInAccount account = task.getResult(ApiException.class);Log.d(m_actTag,"Id:" + account.getId() + "|Email:" + account.getEmail() + "|IdToken:" + account.getIdToken());String personName = account.getDisplayName();String personGivenName = account.getGivenName();String personFamilyName = account.getFamilyName();String personEmail = account.getEmail();String personId = account.getId();String token = account.getIdToken();Uri personPhoto = account.getPhotoUrl();Map<String,String> map = new HashMap<String, String>();map.put("result", "22");map.put("info", "google info success");map.put("id", personId);map.put("token", token);map.put("Email", personEmail);map.put("firstName", personGivenName);map.put("lastName", personFamilyName);map.put("userName", personName);Native.nativeToLogic(m_googleLoginCallBack,map);} catch (ApiException e) {e.printStackTrace();Log.d(m_actTag,"ApiException:" + e.getMessage());Log.e(m_actTag, "google login error:" + e.getMessage());Map<String,String> map = new HashMap<String, String>();map.put("result", "21");map.put("info", e.getMessage());Log.d(m_actTag,"error!!!!!");Native.nativeToLogic(m_googleLoginCallBack,map);}break;}}}public void loginGoogle(final String callback){m_googleLoginCallBack = callback;m_activity.startActivityForResult(getGoogleIntent(), SIGN_LOGIN);}public void logOutGoogle() {if(mGoogleSignInClient != null) {mGoogleSignInClient.signOut();}}public void initSDK(final Activity activity){m_activity = activity;client_id = activity.getResources().getString(R.string.google_client_id);if (mGoogleSignInClient == null) {GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().requestIdToken(client_id).build();mGoogleSignInClient = GoogleSignIn.getClient(m_activity, gso);}} }(4)、res/values/strings.xml 中配置 Web客戶端ID
<string name="google_client_id">200615557981-4mgn8ufi9chaj6gm135aaq6oul01mbph.apps.googleusercontent.com</string>(5)、java 封裝 google sdk 初始化,處理返回,并提供登錄、登出接口 供 js、ts層調用
public class AppActivity extends Cocos2dxActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);GoogleUtils.getInstance().initSDK(this);} @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {GoogleUtils.getInstance().onActivityResult(requestCode, resultCode, data);super.onActivityResult(requestCode, resultCode, data);}public static void loginGoogle(final String callback) {GoogleUtils.getInstance().loginGoogle(callback);}public static void logOutGoogle() {GoogleUtils.getInstance().logOutGoogle();}}(6)、ts 或js 代碼封裝 java 接口
export class Native {public static loginGoogle(func: any,funcParams:string): void {if (cc.sys.isNative) {let cbKey: string = "loginGoogle"window[this.CallBackKey][cbKey] = funclet ret = 0;if (cc.sys.os == cc.sys.OS_ANDROID) {ret = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "loginGoogle", "(Ljava/lang/String;)V", this._callBackPrefix + cbKey + funcParams);}else if (cc.sys.os == cc.sys.OS_IOS) {ret = jsb.reflection.callStaticMethod(Native.ApiIOS, "loginGoogle:", this._callBackPrefix + cbKey);}}}//登出FBpublic static logOutGoogle() {if (cc.sys.isNative) {console.log("logOutGoogle!!!!")if (cc.sys.os == cc.sys.OS_ANDROID) {jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "logOutGoogle", "()V");}else if (cc.sys.os == cc.sys.OS_IOS) {jsb.reflection.callStaticMethod(Native.ApiIOS, "logOutGoogle", null);}}}...... }(7)、ts 或js 代碼調用google 登錄接口
loginGoogle(){let self = this;Native.loginGoogle((ret: any) => {self.googleSdkBack(ret)},"(%s)")}//請求SDK返回googleSdkBack(backInfo:any){console.log("googleSdkBack:",JSON.stringify(backInfo))if(backInfo){if(backInfo.result == "21"){//GG登錄失敗}else if(backInfo.result == "22"){//GG登錄成功并返回用戶數據}}}注意事項:
1、需要使用在同意屏幕時填寫的 google 測試賬號進行登錄測試。
2、需要使用Web客戶端ID才能成功。
總結
以上是生活随笔為你收集整理的Cocos Creator Android 平台 Google 原生登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于JavaWeb的网页版邮箱系统设计与
- 下一篇: RT-Thread学习笔记——邮箱