最近负责海外项目一段时间了,接了不少的海外sdk。无聊就来写写接海外sdk那些事。今天给大家讲的最普通平常的谷歌登录了,以前国内的接过很多,第一次接海外也浪费我不少时间。 有错误的地方还希望大家多多包涵,指出来让我改正。
=========star====
首先你是个人开发者的话,你需要到这里 https://developers.google.com/mobile/add?platform=android&cntapi=signin&cntapp=Default%20Demo%20App&cntpkg=com.google.samples.quickstart.signin&cnturl=https:%2F%2Fdevelopers.google.com%2Fidentity%2Fsign-in%2Fandroid%2Fstart%3Fconfigured%3Dtrue&cntlbl=Continue%20with%20Try%20Sign-In 去注册你的应用,提交你的应用信息,包名,签名等信息,
然后申请好点击下一步后就一个选项和填写你应用的SHA-1值,也就是你打包的签名了,相信接过SDK的童鞋都知道。
最后呢就是你要选择登录验证的方式,有记得有2种,一种是网页验证,一种是本地验证(也就是SDK验证),最后你会得到一个谷歌的JSON文件,里面包括了你应用的所有的信息,包名验证方式,以为我选的是sdk验证,在json里面就有 "client_id": "XXXXXX", "client_type": 3 等信息.其中 client_id 是你重要的登录验证信息 ,当然我们公司有负责对接的海外运营商,所以这写事情由他们去做了,我只需要得到就可以了.
接下来就是如何接入了,下面我已androidstudio 为例. 打开 androidstudio preferencse 之后 appearance & Behavior 然后 System settings 里面的 android SDK 更新你的 googele play service 到最新版本. 这个地址呢就是谷歌官方 https://developers.google.com/identity/sign-in/android/start 的文档了。
===========引用谷歌服务到sdk======
-
将依赖关系添加到您的项目级别
build.gradle
: classpath'com.google.gms:google-services:3.0.0' -
将插件添加到您的应用级别
build.gradle
: 应用插件:'com.google.gms.google-services'上面是让你的引用导入谷歌服务(谷歌官方的 )
下面是我modle 的导入(其实都是一样的)
buildscript { repositories { jcenter() } dependencies { classpath 'com.google.gms:google-services:3.0.0' } } apply plugin: 'com.google.gms.google-services'
在下面就是单独引用谷歌需要的东西了 , 特别是谷歌说要引用全部的,接果我都了引用了之后,早就超出了jar包还是类的最大限制会报错。(下面已个人项目需求为准)dependencies { // 谷歌基本客户端库 compile 'com.google.android.gms:play-services-base:9.0.0' // 谷歌账户登录 compile 'com.google.android.gms:play-services-auth:9.0.0' // 谷歌支付 compile 'com.google.android.gms:play-services-wallet:9.0.0'
}
我呢暂时就需要引用这么多,比如你还需要接谷歌地图 就还需要引入谷歌地图服务+版本
========谷歌登录的设备环境=======
这里呢也有老多坑了,你的手机必须有谷歌安装了谷歌框架,谷歌服务等,
首先去360手机助手里面去下载一个谷歌框架app,运行app后安装所以需要的东西什么谷歌商店等安装完成后建议重启手机一次哦,然后呢你的手机网络必须要能连接国外的网址,什么facebook等,我的手机是买了v*n才行,个人建议还是买个v*n吧,不能连接外网,不然你SDK永远也登录不上谷歌。不然你SDK永远也登录不上谷歌。不然你SDK永远也登录不上谷歌。重要的事情,说三遍。
=========接下来就是写代码了,好鸡动,有木有。=====
类的私有变量
private GoogleApiClient mGoogleApiClient;
private static String clientServerID = "你申请应用过后 josn 里面的 client_id";
private static final int RC_SIGN_IN = 9001;
一共是2种方法
1是你的 Activity必须继承 FragmentActivity 这个不推荐,比如我们cocos的游戏已经继承了别的,貌似又不能多继承,所以这个方法不可取。app 应用或许可取。
2是直接 implements 谷歌的2个接口 GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks 不难看出来一个监听一个是回调哈 当然2种方法都需要 implements 谷歌的2个接口
这3个函数implements接口后就是谷歌的连接状态 方便以后打印调试
@Override public void onConnected(@Nullable Bundle bundle) { Log.d(TAG, "google======连接的"); } @Override public void onConnectionSuspended(int i) { Log.d(TAG, "google======暂停连接"); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Log.d(TAG, "google======发生了无法解析的错误:" + connectionResult); }
============初始化sdk部分=======
/** * 初始化 谷歌sdk */ private void initGooglePlay() { // 初始化 Log.d(TAG, "initGooglePlay....."); GoogleSignInOptions.Builder gsoBuilder = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(clientServerID) .requestServerAuthCode(clientServerID) .requestId() .requestEmail(); mGoogleApiClient = new GoogleApiClient.Builder(mActivity) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Auth.CREDENTIALS_API) .addApi(Auth.GOOGLE_SIGN_IN_API, gsoBuilder.build()) .addScope(new Scope(Scopes.PROFILE)) .addScope(new Scope(Scopes.EMAIL)) .build(); mGoogleApiClient.connect(); }
这里呢需要注意2个问题 1. clientServerID 就是上面我们说过的 你申请应用过后 josn 里面的 client_id josn里面有2个
client_id 是2种验证方法的不同数据 你搞错了就登录不上了 2. mGoogleApiClient.connect(); 是我们手动连接谷歌客服端,如果你的Activity继承了 FragmentActivity,那么就不用了。这是2种登录的区别之处哦。
==========重写Activity获取谷歌的登录token======
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode,resultCode,data);
Log.d(TAG, "google======onActivityResult被调用");
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == RC_SIGN_IN)
{
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
Log.d(TAG, "onActivityResult:GET_TOKEN:success:" + result.getStatus().isSuccess());
if (result.isSuccess())
{
String idToken = result.getSignInAccount().getIdToken();
// TODO(developer): send token to server and validate
Log.d(TAG, "google==========登录成功");
}
else
{
Log.d(TAG, "google==========登录失败");
}
}
}
这里RC_SIGN_IN是一个固定不改变静态的int类型值
private static final int RC_SIGN_IN = 9001;
最后就是调用登录函数了,我自己写的登录函数哈。
startActivityForResult函数 就是开始登录了
public void Login(final int cb) { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); if (signInIntent == null || mGoogleApiClient == null) { Log.d(TAG,"GooglePlay---Login==============ERROR"); return; } startActivityForResult(signInIntent, RC_SIGN_IN); Log.d(TAG,"GooglePlay---Login==============OVER"); }
不出意外你在你的 onActivityResult 函数里面获取到你的 idtoken 和登录账户的邮箱等数据了,到此谷歌登录成功。=======谷歌账户登出=====
/** * 谷歌注销用户 登出函数 成功的回调函数 */ private void signOut() { // 会崩溃 是木有连接到谷歌 Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { Log.d(TAG, "signOut:onResult:" + status); showToast("谷歌登出成功"); } }); }这里呢有小坑,mGoogleApiClient 你要判断不等于nil,而且 mGoogleApiClient必须是连接状态,不然会崩溃!!!
成功调用登出函数后,再次调用登录函数的话,就会出现你谷歌账户里面所有已经登录的账户让你选择登录,不然每次默认都是上一次登录的账户,玩家无法切换。
到此谷歌登录模块基本就完成了,怎么样484很简单啊,so easy啊,看完了是不是感觉很萌萌哒啊。
哈哈 下次继续谷歌支付。
我是大嫂, 爱你们的大嫂!