明天是中秋节,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了,这样就都可以了。