Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

第三方登录之Google登录详细教程

$
0
0

明天是中秋节,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,图上已经标注,仔细看图,紧接着点击白色的大按钮准备回到文档中
这里写图片描述
这里写图片描述
接着往下滚,到最下面点击按钮
这里写图片描述
打开的这个页面时做一些准备工作的,比如导包之类的。如下图,第一个箭头说明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:开头的都在全家桶中,后面的版本号一定一定一定定要一样!!否则编译不通过!!!
这里写图片描述
好吧,好吧,然后就是没有一点技术含量的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();
        mGoogleApiClient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (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;
            }
        }
    }
}

好了代码贴完了,不得不说链式调用真爽,回车键都被我敲掉漆了,哈哈哈。
接下来,要测试Google的东西,手机要科学上网,然后直接run,然后点击登录按钮,看图(不小心暴露我们公司测试美女的账号了,没关系,你们骚扰也没用,这只是一个test账户。)
这里写图片描述
到这基本上就结束了,你以为就这么结束了?nonono。

有一个问题可能会有人问,TMD我打版测试怎么报了这个问题!!!
这里写图片描述

这个问题也困扰了我很长时间,这是因为我们刚刚的SHA1用的是debugkey并不是我们点击generate signed apk 之后的那个key,接下来我们创建一个新的key,图下图,填入基本信息之后是这样的,密码别忘了就行。目录也别忘了。
这里写图片描述
紧接着点击进入Google控制台,如果你之前加过项目应该就轻车熟路了,
这里写图片描述
上图如果你第一次创建的话应该就是你的项目,我之前创建过一个所以我需要点击他,选择这次需要测试的项目,然后到了这样的一个page
这里写图片描述
黄色的叹号有点感觉不太妙,对的,问题就出现在这,你需要点击进入,如下图,输入你刚刚建好的key的SHA1码。
这里写图片描述
然后你就兴高采烈地敲命令来获得新key的SHA1。如下图,发现,沃日!!!文件不存在什么鬼!!!这个地方需要把 你刚刚建好的key的类型(.kjs)去掉,再来,就成功了。同样的套路复制进去,点击完成。
这里写图片描述

打版,跑到手机上,依然可以获得一些信息。OK了,这样就都可以了。

作者:robin_java 发表于2016/9/14 18:23:25 原文链接
阅读:155 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles