Cocos Creator Android 平台 Google 原生登录(二)

简介: Cocos Creator Android 平台 Google 原生登录
第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'
• 1



(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 {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
           GoogleUtils.getInstance().initSDK(this);
      } 
    @Override
    protected 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] = func
            let 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);
            }
        }
    }
    //登出FB
    public 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才能成功。

相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1258 4
|
3月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
201 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
5月前
|
监控 Android开发 数据安全/隐私保护
批量发送短信的平台,安卓群发短信工具插件脚本,批量群发短信软件【autojs版】
这个Auto.js脚本实现了完整的批量短信发送功能,包含联系人管理、短信内容编辑、发送状态监控等功能
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
321 1
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
9月前
|
存储 编解码 监控
Android平台GB28181执法记录仪技术方案与实现
本文介绍了大牛直播SDK的SmartGBD在执法记录仪场景中的应用。GB28181协议作为视频监控联网的国家标准,为设备互联互通提供规范。SmartGBD专为Android平台设计,支持音视频采集、编码与传输,具备自适应算法和多功能扩展优势。文章分析了执法记录仪的需求,如实时音视频传输、设备管理及数据安全,并详细阐述了基于SmartGBD的技术实现方案,包括环境准备、SDK集成、设备注册、音视频处理及功能扩展等步骤。最后展望了SmartGBD在未来智慧物联领域的广阔应用前景。
538 13
|
9月前
|
存储 编解码 开发工具
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
本文详细探讨了在Android平台上实现HTTP-FLV播放器的过程。首先介绍了FLV格式的基础,包括文件头和标签结构。接着分析了HTTP-FLV传输原理,通过分块传输实现流畅播放。然后重点讲解了播放器的实现步骤,涵盖网络请求、数据解析、音视频解码与渲染,以及播放控制功能的设计。文章还讨论了性能优化和网络异常处理的方法,并总结了HTTP-FLV播放器的技术价值,尤其是在特定场景下的应用意义。
429 11
|
9月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
IDE 开发工具 Android开发
移动应用开发之旅:探索Android和iOS平台
在这篇文章中,我们将深入探讨移动应用开发的两个主要平台——Android和iOS。我们将了解它们的操作系统、开发环境和工具,并通过代码示例展示如何在这两个平台上创建一个简单的“Hello World”应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧,帮助你更好地理解和掌握移动应用开发。
308 17
|
Java API 开发工具
Cocos游戏如何快速接入安卓优量汇广告变现?
本文介绍了如何在Cocos游戏项目中快速接入安卓优量汇广告,通过详细的步骤指导,包括前期准备、编辑gradle和清单文件、核心代码集成等,帮助开发者轻松实现广告功能,增加游戏的盈利渠道。文中还提供了示例工程下载链接,方便开发者直接上手实践。
Cocos游戏如何快速接入安卓优量汇广告变现?

热门文章

最新文章

推荐镜像

更多