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)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1303 4
|
4月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
227 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
8月前
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
148 0
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
889 1
安卓项目:app注册/登录界面设计
|
Android开发
错误记录:调用原生TvSettings 的 com.android.tv.settings.device.storage.ResetActivity 无法启动
本文记录了一个Android TV设置中由于未设置`android:exported="true"`导致`com.android.tv.settings.device.storage.ResetActivity`无法被第三方app启动的错误,并通过添加该属性成功解决了问题。
259 1
|
Android开发 数据安全/隐私保护 虚拟化
安卓手机远程连接登录Windows服务器教程
安卓手机远程连接登录Windows服务器教程
2795 5
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
336 1
|
开发工具 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.
383 1
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
419 2

热门文章

最新文章

推荐镜像

更多