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)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1420 4
|
6月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
549 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
Android开发
错误记录:调用原生TvSettings 的 com.android.tv.settings.device.storage.ResetActivity 无法启动
本文记录了一个Android TV设置中由于未设置`android:exported="true"`导致`com.android.tv.settings.device.storage.ResetActivity`无法被第三方app启动的错误,并通过添加该属性成功解决了问题。
298 1
|
Java API 开发工具
Cocos游戏如何快速接入安卓优量汇广告变现?
本文介绍了如何在Cocos游戏项目中快速接入安卓优量汇广告,通过详细的步骤指导,包括前期准备、编辑gradle和清单文件、核心代码集成等,帮助开发者轻松实现广告功能,增加游戏的盈利渠道。文中还提供了示例工程下载链接,方便开发者直接上手实践。
Cocos游戏如何快速接入安卓优量汇广告变现?
|
开发工具 Android开发
上架Google Play报错:For new apps, Android App Bundles must be signed with an RSA key.
上架Google Play报错:For new apps, Android App Bundles must be signed with an RSA key.
440 1
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
601 4
|
安全 Java Android开发
Android 14适配Google play截止时间临近,适配注意点和经验
本文介绍了Android 14带来的关键更新,包括性能优化、定制化体验、多语言支持、多媒体与图形增强等功能。此外,还强调了适配时的重要事项,如targetSdkVersion升级、前台服务类型声明、蓝牙权限变更等,以及安全性与用户体验方面的改进。开发者需按官方指南更新应用,以充分利用新特性并确保兼容性和安全性。
1031 0
|
Shell Go 开发工具
How to decompile Google Android .apk file as readable dump【原创】
How to decompile Google Android .apk file as readable dump【原创】
206 0
|
JSON Android开发 数据格式
Android框架-Google官方Gson解析,android开发实验报告总结
Android框架-Google官方Gson解析,android开发实验报告总结
|
数据可视化 定位技术 Sentinel
如何用Google Earth Engine快速、大量下载遥感影像数据?
【2月更文挑战第9天】本文介绍在谷歌地球引擎(Google Earth Engine,GEE)中,批量下载指定时间范围、空间范围的遥感影像数据(包括Landsat、Sentinel等)的方法~
5574 1
如何用Google Earth Engine快速、大量下载遥感影像数据?

热门文章

最新文章

推荐镜像

更多