第三方登录之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上的项目

1 0
原创粉丝点击