在海外项目中,我们通常需要接入 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 原生登录相关推荐

  1. Cocos Creator Android 平台 Facebook 原生登录

    在做海外项目中,经常需要接入Facebook SDK ,现将CocosCreator Android 平台 Facebook 登录的接入流程记录下来,以备有需要的朋友做参考. 一.准备工作 1.首先在 ...

  2. cocos creator Android 接入Google登陆sdk

    准备工作 这里就不详细介绍,主要说一下客户端sdk接入 1.手机上安装Google服务 2.一个绑定信用卡的Google账号: 3.Google play客户端: 4..Google Play开发者后 ...

  3. cocos creator Android 接入Google支付sdk

    准备工作 1.手机上安装Google服务 2.一个绑定信用卡的Google账号: 3.Google play客户端: 4..Google Play开发者后台创建应用 5.科学上网的工具 -等等 这些就 ...

  4. cocos creator利用ShareSDK实现微信登录功能

    首先在ShareSDK官网下载SDK或者在android studio中配置build.gradle. ShareSDK Maven集成文档 注:使用ShareSDK maven集成方式,不需要在An ...

  5. cocos creator android 真机调试配置密匙

    android 真机调试与打包 真机调式 cocos creator 环境配置完成后 选择 编辑器 => 项目 => 构建发布 => android => 构建 构建完成后打开 ...

  6. 用 Cocos Creator 制作平台跳跃游戏

    前言 平台跳跃类游戏如<超级马里奥><Celeste蔚蓝>等,非常考验玩家的操作和判断,有着非常本真的游戏乐趣.这类游戏乍一看,挺容易做的,但是要做好却不太容易.今天,我将使用 ...

  7. cocos creator android之微信开放平台修改签名 baseResp.errCode=-6

    1.baseResp.errCode=-6 就代表签名和打包的秘钥生成的签名不一致,会导致调起来的微信授权登录页一片空白,我用cocos的应用包名去生成md5签名和用keystore生成的签名不一致, ...

  8. 【转】构建Android平台Google Map应用

    http://www.moandroid.com/?p=1360 Android 的新版本提供了的功能,通过这段视频,大家可以先简单了解下: Android 提供的地图(Map)功能可能是广大开发者非 ...

  9. Android平台接入Facebook登录

    官方教程地址: https://developers.facebook.com/docs/android/getting-started 开发环境为Android Studio,官方要求SDK最低版本 ...

最新文章

  1. love2d杂记9--光照效果
  2. oracle别名作用范围,在Oracle的Where子句子查询中使用别名或表名,
  3. 递归实现10进制转8进制,字符串数字互转,判断数组正逆向
  4. JS的DOM和BOM
  5. 360天气怎么设置方法 360天气如何设置城市
  6. keepalived实现双机备份
  7. 阿里mysql笔记_MySQL学习笔记(一)
  8. clickhouse 物化视图_再谈clickHouse:微博基于 ClickHouse 监控百亿流量下的指标
  9. HTML表单元素、表单控件
  10. 使用OpenCV进行图片模糊处理(中值滤波)
  11. 模拟钟表的手机软件_手机时钟软件推荐
  12. Win10将中文用户名修改为英文
  13. Keil与ADS软件冲突问题解决办法
  14. IBM SPSS Modeler 【3】 神经网络的生成
  15. C语言-函数(一):函数的定义和调用
  16. 【转载】软件质量报告模板-产品质量度量
  17. [内附完整源码和文档] 基于Java的航空售票管理系统
  18. 计算机诞生以来应用最早的,全国一级b考试练习题.doc
  19. 汉字如何造就世界上最伟大的文化整体
  20. JS实现动态添加和删除div

热门文章

  1. 用计算机弹猴哥,《西游记》孙悟空获“弼马温”一职,网友弹屏吐槽:猴哥被忽悠了...
  2. oracle cux,EBS增加客制应用CUX:Custom Application
  3. bcd码 php,转载:BCD码
  4. 揭秘Google排名的60个因素
  5. oracle em错误,em使用错误,求建议
  6. 路由表和转发表以及SDN的open-flow table表的区别
  7. 使用香橙派zero2及其他单网口开发板搭建UU加速盒
  8. 服务器插无线usb网卡驱动,cubieboard安装USB无线网卡驱动及设置
  9. android 防止屏幕误碰,小米11带来硬件防误触解决方案,彻底解决曲面屏误触问题...
  10. 洛谷 P1162 填涂颜色 C++ 深搜 染色法