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才能成功。

相关文章
|
2月前
|
Android开发
安卓SO层开发 -- 编译指定平台的SO文件
安卓SO层开发 -- 编译指定平台的SO文件
32 0
|
3月前
|
数据安全/隐私保护 Android开发
2023安卓逆向 -- 某合伙apk登录加密分析
2023安卓逆向 -- 某合伙apk登录加密分析
26 0
|
3月前
|
IDE API 开发工具
Google I/O :Android Jetpack 最新变化(四)Compose
Google I/O :Android Jetpack 最新变化(四)Compose
106 0
|
1月前
|
运维 监控 Java
应用研发平台EMAS产品常见问题之安卓构建版本失败如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
|
1月前
|
运维 监控 Android开发
应用研发平台EMAS常见问题之安卓push的离线转通知目前无法收到如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
25 1
|
3月前
|
编解码 测试技术 开发工具
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
|
3月前
|
开发工具 Android开发
Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
Android平台RTMP推送|轻量级RTSP服务|GB28181设备接入模块之实时快照保存JPG还是PNG?
|
3月前
|
数据采集 编解码 图形学
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
104 0
|
2月前
|
数据可视化 定位技术 Sentinel
如何用Google Earth Engine快速、大量下载遥感影像数据?
【2月更文挑战第9天】本文介绍在谷歌地球引擎(Google Earth Engine,GEE)中,批量下载指定时间范围、空间范围的遥感影像数据(包括Landsat、Sentinel等)的方法~
507 0
如何用Google Earth Engine快速、大量下载遥感影像数据?
|
2月前
|
编解码 人工智能 算法
Google Earth Engine——促进森林温室气体报告的全球时间序列数据集
Google Earth Engine——促进森林温室气体报告的全球时间序列数据集
24 0