第三方登录之Google登录详细教程
来源:互联网 发布:php在线教学平台源码 编辑:程序博客网 时间:2024/06/08 06:06
明天是中秋节,robin祝大家中秋团圆。
说明一下几个问题:
1.全程所有设备科学上网
2.环境+设备AS2.1.2+一加手机1(CM13,Android6.0)
3.目前小米手机4C,MIUI开发版,一直点击按钮之后没有反应(感觉是整个屏幕被盖了一层,无法在进行点击之类的操作,关于这个问题,我们想到的一种办法请直接拉倒底部)。欢迎小米手机的开发者测试!
4.我一直在更新。如果有什么问题,欢迎评论或者加QQ:402892393.
(弱弱的问一句,你们那些转的文章,能不能表明出处?下面两个网站你们好自为之!
第一个侵权网站
第二个侵权网站)
郑重声明:本博客是作者一点一点的辛勤汗水的积累,请准中作者的劳动成果,转发时请表明出处!!
这两天在倒腾Google登录,现在基本上是整明白了,再次跟大家分享一下。(前方多图警告!!)
毫无疑问,这种第三方登录先去找官方API,科学上网的小伙伴点击起飞,我看了看感觉有些地方逻辑不是那么好,再加上纯英文的文档可能让想我一样的英文处于2岁小孩水平的小伙伴一脸懵逼。那我就带着大家一步一步按照套路来。
首先你需要科学上网(VPN或者lantern),然后进入上面我让大家点击的网址,点击下方蓝色按钮
紧接着会看到线面的page,
输入项目名称可包名(最好和创建的项目一直,要不我怕出幺蛾子),包名在AndroidManifest.xml中的package里面,好吧,我觉得我再说废话。
再点击下方蓝色大按钮,如图click,会看到如下的page,
紧接着,向下滚动,重点来了,需要一个SHA-1(安全的哈希算法),这个需要输入的,去哪里找呢?
在这里,看图,win+R–>cmd–>输入命令keytool -list -v -keystore mystore.keystore(mystore.keystore为你的debugkey的路径,这个路径一般在C:\Users\Administrator.android 这里面有一个debug.keystore,如果你的招不到请自行上网查找),然后就能得到你的SHA1的值,右键–>标记–>标记这个值–>回车(这时候已经复制了)
去到上面的图粘贴到输入框里面,然后点击蓝色大按钮。
之后就来到了下面的page,图上已经标注,仔细看图,紧接着点击白色的大按钮准备回到文档中
重要的提示,这里有的同学可能要更换SHA-1码,这时候要更新这个google-services.json文件的,怎么更新呢?点击进入 重新走一遍刚才的这个流程,就会看到更新的SHA-1码了!否则你还是会爆出ERROR的!!切记切记!!
接着往下滚,到最下面点击按钮
打开的这个页面时做一些准备工作的,比如导包之类的。如下图,第一个箭头说明2.3以上才能用(现在还TMD有适配2.3的设备?我们APP这么落后都4.0起步了),第二个箭头是要让你打开SDK manager去下载Google Play Service的,这个必须有。下载完成之后在你的SDK目录—extras—google—google_play_services就出来了。然后点击下面蓝色按钮(GET A CONFIGURATION FILE),目测要去配置信息之类的了,都是这套路。
接下来是这个page,同样输入项目名称可包名(最好和创建的项目一直,要不我怕出幺蛾子),点击蓝色大按钮。
再点击蓝色大按钮(不是close那个按钮!!!!),如下图。
到这里基本上是完成了90%了,你会问了,TMD你练代码都没写一个字母就说完成了这么多!!!客官,别急嘛~~
到后就是导包,我到的是最新的(2016年9月14日),最新的在科学上网走起,我不敢保证Google在我写完这篇博客之后会不会换地址,我还是把我的献上吧,compile ‘com.google.android.gms:play-services-auth:9.2.1’
这里有个可能菜鸟会遇到的坑,就是因为我们APP会继承很多Google的包,也就是Google全家桶,一般以com.google.android.gms:开头的都在全家桶中,后面的版本号一定一定一定定要一样!!否则编译不通过!!!可能还有用eclipse的同学,需要jar/arr包,找不着怎么办?我这有,联系402892393,会发给你的。(我也想上传,但是不知道用这个编辑器怎么上传lol)
好吧,好吧,然后就是没有一点技术含量的coding了。。。直接贴代码。
先来UI的代码。
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.administrator.googlelogindemo.MainActivity"> <com.google.android.gms.common.SignInButton android:id = "@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <TextView android:id="@+id/tv_1" android:layout_width="match_parent" android:layout_marginTop="30dp" android:layout_below="@+id/sign_in_button" android:background="#00ffff" android:textColor="#000" android:textSize="20sp" android:layout_height="wrap_content" /></RelativeLayout>
再来activity的代码,都是API文档中的套路,大差不差。
package com.example.administrator.googlelogindemo;import android.content.Intent;import android.os.Bundle;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.TextView;import com.google.android.gms.auth.api.Auth;import com.google.android.gms.auth.api.signin.GoogleSignInAccount;import com.google.android.gms.auth.api.signin.GoogleSignInOptions;import com.google.android.gms.auth.api.signin.GoogleSignInResult;import com.google.android.gms.common.ConnectionResult;import com.google.android.gms.common.SignInButton;import com.google.android.gms.common.api.GoogleApiClient;public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener { private GoogleApiClient mGoogleApiClient; private SignInButton sign_in_button; private static int RC_SIGN_IN=10001; private TextView tv_1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GoogleSignInOptions gso = new GoogleSignInOptions .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestId() .build(); mGoogleApiClient = new GoogleApiClient .Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .enableAutoManage(this, this)/* FragmentActivity *//* OnConnectionFailedListener */ .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); tv_1 = (TextView) findViewById(R.id.tv_1); sign_in_button = (SignInButton) findViewById(R.id.sign_in_button); sign_in_button.setSize(SignInButton.SIZE_STANDARD); sign_in_button.setScopes(gso.getScopeArray()); sign_in_button.setOnClickListener(this); } private void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, RC_SIGN_IN); } private void handleSignInResult(GoogleSignInResult result){ Log.i("robin", "handleSignInResult:" + result.isSuccess()); if(result.isSuccess()){ Log.i("robin", "成功"); GoogleSignInAccount acct = result.getSignInAccount(); if(acct!=null){ Log.i("robin", "用户名是:" + acct.getDisplayName()); Log.i("robin", "用户email是:" + acct.getEmail()); Log.i("robin", "用户头像是:" + acct.getPhotoUrl()); Log.i("robin", "用户Id是:" + acct.getId());//之后就可以更新UI了 Log.i("robin", "用户IdToken是:" + acct.getIdToken()); tv_1.setText("用户名是:" + acct.getDisplayName()+"\n用户email是:" + acct.getEmail()+"\n用户头像是:" + acct.getPhotoUrl()+ "\n用户Id是:" + acct.getId()+"\n用户IdToken是:" + acct.getIdToken()); } }else{ tv_1.setText("登录失败"); Log.i("robin", "没有成功"+result.getStatus()); } } @Override public void onConnected(@Nullable Bundle bundle) { Log.i("robin","google登录-->onConnected,bundle=="+bundle); } @Override public void onConnectionSuspended(int i) { Log.i("robin","google登录-->onConnectionSuspended,i=="+i); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Log.i("robin","google登录-->onConnectionFailed,connectionResult=="+connectionResult); } @Override protected void onStart() { super.onStart(); if(mGoogleApiClient!=null) mGoogleApiClient.connect(); } @Override protected void onStop() { super.onStop(); if (mGoogleApiClient!=null&&mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.i("robin", "requestCode==" + requestCode + ",resultCode==" + resultCode + ",data==" + data); if(requestCode==RC_SIGN_IN){ GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } } @Override public void onClick(View view) { switch (view.getId()) { case R.id.sign_in_button: { Log.i("robin","点击了登录按钮"); signIn(); break; } } }}
好了代码贴完了,不得不说链式调用真爽,回车键都被我敲掉漆了,哈哈哈。
这里有人提出来怎么 acct.getIdToken()总是null原因是一般情况用不到这个token如果要用的话要在前面GoogleSignInOptions.build()之前调用一句requestIdToken(String serverClient),这里面需要一个客户端 ID,想知道这个东西在哪里,继续向下看。
接下来,要测试Google的东西,手机要科学上网,然后直接run,然后点击登录按钮,看图(不小心暴露我们公司测试美女的账号了,没关系,你们骚扰也没用,这只是一个test账户。)
到这基本上就结束了,你以为就这么结束了?nonono。
有一个问题可能会有人问,TMD我打版测试怎么报了这个问题!!!
这个问题也困扰了我很长时间,这是因为我们刚刚的SHA1用的是debugkey并不是我们点击generate signed apk 之后的那个key,接下来我们创建一个新的key,图下图,填入基本信息之后是这样的,密码别忘了就行。目录也别忘了。
紧接着点击进入Google控制台,如果你之前加过项目应该就轻车熟路了,
上图如果你第一次创建的话应该就是你的项目,我之前创建过一个所以我需要点击他,选择这次需要测试的项目,然后到了这样的一个page
黄色的叹号有点感觉不太妙,对的,问题就出现在这,你需要点击进入,如下图,输入你刚刚建好的key的SHA1码。
然后你就兴高采烈地敲命令来获得新key的SHA1。如下图,发现,沃日!!!文件不存在什么鬼!!!这个地方需要把 你刚刚建好的key的类型(.kjs)去掉,再来,就成功了。同样的套路复制进去,点击完成。
打版,跑到手机上,依然可以获得一些信息。OK了,这样就都可以了。
细心地同学可能注意到了,这个控制台有一部分是OAuth 2.0这是自己创建的,创建流程如下,点击上面创建凭据,选择OAuth 客户端 ID,选择平台(这里我们选择android),然后根据命令选择你的key,然后把SHA-1码扔进去,OK了。创建成功之后会提示你客户端 ID的,这个ID就是上文requestIdToken()方法需要的ID,放进去,然后getIdToken就能得到了。
说一下一开始提出的问题,既然是开头描述的那样,为什么有的APP还可以登录呢?只要按照google的套路出来的,代码都是一样的,那肯定是不行的。所以只能另辟蹊径,就是他们从google拿到一些信息之后,然后给他手动画出来,比如能拿到头像,用户名之类的,可以手动放进去,对,没错,其实是手动画出的的那个选择登录用户页。这样就能登陆成功了,只要用户感觉正常就可以了。这值是一种猜想。还有人测试我的app 说是更新一下google服务,也能行。哎,万恶的蛤社会!!!google赶紧回到祖国的怀抱吧~~
这里说一下google console的超级大坑,如果你的账号下面有好几个项目,那么他是不允许你Auth 2.0下面的的SHA1码相同,但是问题来了,我们的debugkey是一样的在一台电脑上,并不会因为项目的不同而不同,所以这就出现矛盾了,要不你就只用自己打的key(顺便说一句,自己打key的时候alias的名字最好不要有空格!!),要不就只能吧别的项目删掉了。刚才上面说到Auth 2.0,他的下面也要配置好你的debugkey和自己的key的SHA1码,否则,缺哪个那个就不好用,一般会报错大概叫Status{statusCode=DEVELOPER_ERROR,resolution=null},这些官方文档上我都没找到,可能是因为我的英语比较的poor,不能那么直观的一针见血的understand google api doc。
这是我和我的小伙伴的呕心力作,实现了Twitter,google puls,Facebook登录,欢迎star,fork
上面的东西因为牵扯到一些key或者是SHA1之类的私密的东西,可能会出现问题,碰到问题直接联系QQ 402892393。我还创建了一个android/java/H5交流的群560912651,大家都可以互相交流技术(有时候一言不合就斗图).
最后友善的提醒一句,最近很多人加我QQ问我问题,我都很愿意的去解答,在帮助别人的时候也是对自己的一种提升,但是总是有些人问一些无聊的问题。比如,手机连Google全家桶都没有,就问我为什么报错,那这种人能不能去试试别的有Google+登录的例子?别的大型app都不好,那你就要找找是不是设备的问题了。还有很多报错 DEVELOPE_ERROR 都是因为你的SHA-1码有问题!仔细检查!还有一个就是这个项目的SHA-1码我已经都换掉了,所以建议大家 移步到我的github上的项目
- 第三方登录之Google登录详细教程
- QQ第三方登录的详细教程
- 第三方登录 java Google
- 第三方微信登录详细教程
- iOS 第三方登录之 QQ登录
- 第三方登录之微信登录
- java 第三方登录之QQ登录
- java 第三方登录之QQ登录
- 第三方登录之支付宝登录
- 第三方登录facebook登录简单集成iOS APP超详细教程
- 第三方登录之QQ
- 第三方登录之QQ
- 第三方之QQ登录
- google第三方登录集成说明(android)
- Github 第三方授权登录教程
- 接入google SDK登录、支付,facebook SDK登录详细教程
- 第三方登录之微信登陆
- 第三方登录之新浪微博
- Android monkey测试小记
- 数据结构-1
- 上下级控件同名引发的血案
- vagrant参考网址
- 快速找到好书・好博客・好论坛
- 第三方登录之Google登录详细教程
- POJ 3321
- Qt中Qtableview 的使用2(QStandardItemModel模型)
- javaweb项目发布后在浏览器上显示的图标
- 解决 out of memory 的方法
- Scala Cookbook读书笔记 Chapter 3.Control Structures 第一部分
- 鼠标悬浮事件 -jQuery hover()方法
- C++11并发/多线程编程系列(3)
- Qt中Qtableview的使用1(QSqlTableModel模型)