Android 应用程序集成Google 登录及二次封装

简介: 谷歌登录API:  https://developers.google.com/identity/sign-in/android/ 1、注册并且登录google网站        https://accounts.
谷歌登录API:  https://developers.google.com/identity/sign-in/android/

1、注册并且登录google网站

       https://accounts.google.com/

2、进入google开发者平台创建应用

     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

3、在开发者平台填写响应的信息,包括 应用名、包名、签名的SHA-1值

     图1

     

      图2

        

      图3

        

 

4、在项目中添加谷歌服务

       4.1、在SDK Manager 里面下载 google service

                

        4.2、在project目录下的build.gradle下添加

                 classpath 'com.google.gms:google-services:2.1.0-alpha4'

              查看最新版本号:https://jcenter.bintray.com/com/google/gms/google-services/

        4.3  在model目录下的build.gradle下添加

               compile 'com.google.android.gms:play-services-auth:8.4.0'

 5、代码实现

         5.1、在布局文件中            

 1  <com.google.android.gms.common.SignInButton
 2             android:id="@+id/google_signIn_bt"
 3             android:layout_width="wrap_content"
 4             android:layout_height="wrap_content" />
 5 
 6         <Button
 7             android:id="@+id/google_loginOut_bt"
 8             android:layout_width="match_parent"
 9             android:layout_height="wrap_content"
10             android:text="google退出登录"
11             android:layout_gravity="center"
12             android:gravity="center"
13             >
14         </Button>

        5.2、java代码

  1 package com.pegasus.map.presentation.ui.activity;
  2 
  3 import android.content.Intent;
  4 import android.os.Bundle;
  5 import android.view.View;
  6 import android.widget.Button;
  7 
  8 import com.google.android.gms.auth.api.Auth;
  9 import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
 10 import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
 11 import com.google.android.gms.auth.api.signin.GoogleSignInResult;
 12 import com.google.android.gms.common.ConnectionResult;
 13 import com.google.android.gms.common.SignInButton;
 14 import com.google.android.gms.common.api.GoogleApiClient;
 15 import com.google.android.gms.common.api.ResultCallback;
 16 import com.google.android.gms.common.api.Status;
 17 import com.pegasus.map.R;
 18 import com.pegasus.map.presentation.ui.base.BaseActivity;
 19 
 20 import butterknife.Bind;
 21 import butterknife.ButterKnife;
 22 
 23 /**
 24  * Created by ${zyj} on 2016/3/24.
 25  * 登录
 26  */
 27 
 28 public class LoginActivity1 extends BaseActivity implements GoogleApiClient.OnConnectionFailedListener , View.OnClickListener  {
 29 
 30     public int RequestCode = 10 ;
 31 
 32     @Bind( R.id.google_signIn_bt )
 33     public SignInButton google_signIn_bt ;
 34 
 35     @Bind( R.id.google_loginOut_bt )
 36     public Button google_loginOut_bt ;
 37 
 38     public GoogleSignInOptions gso ;
 39     public GoogleApiClient mGoogleApiClient ;
 40 
 41     @Override
 42     protected void onCreate(Bundle savedInstanceState) {
 43         super.onCreate(savedInstanceState);
 44         setContentView(R.layout.activity_login);
 45         ButterKnife.bind(this);
 46         init();
 47     }
 48 
 49 
 50     private void init() {
 51         //初始化谷歌登录服务
 52         gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
 53                 .requestEmail()   //获取邮箱
 54                 .requestId()      //获取id 号
 55                 .requestIdToken("456212545785")  //获取token
 56                 .build();
 57 
 58         // Build a GoogleApiClient with access to GoogleSignIn.API and the options above.
 59         mGoogleApiClient = new GoogleApiClient.Builder( this )
 60                 .enableAutoManage( this , this )
 61                 .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
 62                 .build();
 63 
 64         //登录
 65         google_signIn_bt.setSize(SignInButton.SIZE_STANDARD);
 66         google_signIn_bt.setScopes(gso.getScopeArray());
 67         google_signIn_bt.setOnClickListener(this) ;
 68 
 69         //退出
 70         google_loginOut_bt.setOnClickListener(this) ;
 71 
 72     }
 73 
 74     @Override
 75     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 76         super.onActivityResult(requestCode, resultCode, data);
 77 
 78         //谷歌登录成功回调
 79         if ( requestCode == RequestCode ) {
 80             GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
 81             handleSignInResult( result ) ;
 82         }
 83     }
 84 
 85     @Override
 86     public void onConnectionFailed(ConnectionResult connectionResult) {
 87 
 88     }
 89 
 90     @Override
 91     public void onClick(View v) {
 92         switch ( v.getId() ){
 93             case R.id.google_signIn_bt :   //登录
 94                 signIn();
 95                 break;
 96 
 97             case R.id.google_loginOut_bt :
 98                 signOut();
 99                 break;
100         }
101     }
102 
103     /**
104      * 登录
105      */
106     private void signIn() {
107         Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
108         startActivityForResult(signInIntent, RequestCode );
109     }
110 
111     /**
112      * 退出
113      */
114     private void signOut() {
115         Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
116                 new ResultCallback<Status>() {
117                     @Override
118                     public void onResult(Status status) {
119                         // ...
120                     }
121                 });
122     }
123 
124     private void handleSignInResult(GoogleSignInResult result) {
125         if (result.isSuccess()) {
126             // Signed in successfully, show authenticated UI.
127             GoogleSignInAccount acct = result.getSignInAccount();
128             //获取用户名
129             String name = acct.getDisplayName() ;
130             String email = acct.getEmail() ;
131             String token = acct.getIdToken() ;
132             String id = acct.getId() ;
133 
134         } else {
135             // Signed out, show unauthenticated UI.
136         }
137     }
138 
139 }

 

 6、Google SDK 二次封装

         

  1 package com.pegasus.map.presentation.utils;
  2 
  3 import android.content.Intent;
  4 import android.support.v4.app.FragmentActivity;
  5 import android.util.Log;
  6 import android.widget.Toast;
  7 
  8 import com.google.android.gms.auth.api.Auth;
  9 import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
 10 import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
 11 import com.google.android.gms.auth.api.signin.GoogleSignInResult;
 12 import com.google.android.gms.common.api.GoogleApiClient;
 13 import com.google.android.gms.common.api.ResultCallback;
 14 import com.google.android.gms.common.api.Status;
 15 import com.pegasus.map.R;
 16 
 17 /**
 18  * Created by ${zyj} on 2016/3/30.
 19  */
 20 public class GoogleLogin {
 21 
 22     public int requestCode = 10 ;
 23     private FragmentActivity activity ;
 24     public GoogleSignInOptions gso ;
 25     public GoogleApiClient mGoogleApiClient ;
 26     public GoogleApiClient.OnConnectionFailedListener listener ;
 27     private GoogleSignListener googleSignListener ;
 28 
 29     public GoogleLogin(FragmentActivity activity , GoogleApiClient.OnConnectionFailedListener listener ){
 30         this.activity = activity ;
 31         this.listener = listener ;
 32 
 33         //初始化谷歌登录服务
 34         gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
 35                 .requestEmail()
 36                 .requestId()
 37                 .requestIdToken( activity.getString(R.string.google_server_client_id))
 38                 .requestProfile()
 39                 .build();
 40 
 41         // Build a GoogleApiClient with access to GoogleSignIn.API and the options above.
 42         mGoogleApiClient = new GoogleApiClient.Builder( activity )
 43                 .enableAutoManage( activity , listener )
 44                 .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
 45                 .build();
 46     }
 47 
 48 
 49     /**
 50      * 登录
 51      */
 52     public void signIn() {
 53         Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
 54         activity.startActivityForResult(signInIntent, requestCode);
 55     }
 56 
 57     /**
 58      * 退出登录
 59      */
 60     public void signOut() {
 61         Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
 62                 new ResultCallback<Status>() {
 63                     @Override
 64                     public void onResult(Status status) {
 65                         if ( status.isSuccess() ){
 66                             if ( googleSignListener != null ){
 67                                 googleSignListener.googleLogoutSuccess();
 68                             }
 69                         }else {
 70                             if ( googleSignListener!= null ){
 71                                 googleSignListener.googleLogoutFail();
 72                             }
 73                         }
 74                     }
 75                 });
 76     }
 77 
 78     public String handleSignInResult(GoogleSignInResult result) {
 79         String res = "" ;
 80         if (result.isSuccess()) {
 81             //登录成功
 82             GoogleSignInAccount acct = result.getSignInAccount();
 83             res = "登录成功"
 84                     + "用户名为:" + acct.getDisplayName()
 85                     + "  邮箱为:" + acct.getEmail()
 86                     + " token为:" + acct.getIdToken()
 87                     + " 头像地址为:" + acct.getPhotoUrl()
 88                     + " Id为:" + acct.getId()
 89                     + " GrantedScopes为:" + acct.getGrantedScopes() ;
 90             Log.e("res", "res:"+res);
 91             Toast.makeText( activity, res, Toast.LENGTH_SHORT).show();
 92             if ( googleSignListener != null ){
 93                 googleSignListener.googleLoginSuccess();
 94             }
 95         } else {
 96             // Signed out, show unauthenticated UI.
 97             res = "-1" ;  //-1代表用户退出登录了 , 可以自定义
 98             Toast.makeText( activity , "退出登录", Toast.LENGTH_SHORT).show();
 99             if ( googleSignListener != null ){
100                 googleSignListener.googleLoginFail();
101             }
102         }
103         return res ;
104     }
105 
106 
107     public void setGoogleSignListener( GoogleSignListener googleSignListener ){
108         this.googleSignListener = googleSignListener ;
109     }
110 
111     public interface GoogleSignListener {
112         void googleLoginSuccess();
113         void googleLoginFail() ;
114         void googleLogoutSuccess();
115         void googleLogoutFail() ;
116     }
117 
118 }

   注意:当你把 GoogleLogin 类复制到你项目中的时候,activity.getString(R.string.google_server_client_id)  这一句会报错,可以先不用管,在6.5 部分会做说明

 

  6.1  在activity里使用封装类

   activity 实现   GoogleApiClient.OnConnectionFailedListener , GoogleLogin.GoogleSignListener  两个接口

 6.2

 //初始化谷歌登录服务
 GoogleLogin googleLogin = new GoogleLogin( this , this ) ;
 googleLogin.setGoogleSignListener(this);

 6.3

 1     @Override
 2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 3         super.onActivityResult(requestCode, resultCode, data);
 4         
 5         //谷歌登录成功回调
 6         if (requestCode == googleLogin.requestCode ) {
 7             GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
 8             googleLogin.handleSignInResult( result ) ;
 9         }
10     }

6.4

1 //登录
2 googleLogin.signIn();
3                 
4  //退出
5 googleLogin.signOut();

 6.5 获取 google_server_client_id , 并在strings 里面配置

       https://console.developers.google.com/projectselector/apis/credentials

       在上面的网站里选择

         

        

         点击选择项目,然后选择你创建的app,进入下面一个界面,得到对应的Client ID

       

      

 

 

补充:(2016/8/9)

    有很多人留言或者发私信说一直登陆失败。然后我就自己写了一个demo,核心代码完全复制博客里面的 GoogleLogin (代码见第六个标题, 6、Google SDK 二次封装) 里面的代码,真的是一行代码都没有改,完完全全复制的。最后实现登陆成功,可见博客里面的代码是没有问题的。我在操作过程中,有几个关键的地方提一下。

1、权限问题

    只需要添加联网权限即可   <uses-permission android:name="android.permission.INTERNET"></uses-permission>

 

 2、签名问题

      在开发者后台创建app的时候,需要添加 SHA-1的值,这个值是从你的签名里面获取的。注意,在你运行demo的时候,如果直接运行是不行的,因为直接运行,android studio 会为你的app使用默认签名,这个签名是系统自带的,这个签名的SHA-1值肯定和你真正的签名文件SHA-1值不一样,所以必然会登录失败。 你需要修改你的app debug 时的签名和 发布时的签名一直就好了。 

 

 

         

      

相关文章
|
21天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
159 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
179 3
|
16天前
|
存储 人工智能 NoSQL
Airweave:快速集成应用数据打造AI知识库的开源平台,支持多源整合和自动同步数据
Airweave 是一个开源工具,能够将应用程序的数据同步到图数据库和向量数据库中,实现智能代理检索。它支持无代码集成、多租户支持和自动同步等功能。
87 14
|
1月前
|
机器人 应用服务中间件 API
轻松集成私有化部署Dify文本生成型应用
Dify 是一款开源的大语言模型应用开发平台,融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者能快速搭建生产级生成式 AI 应用。通过阿里云计算巢,用户可以一键部署 Dify 社区版,享受独享的计算和网络资源,并无代码完成钉钉、企业微信等平台的应用集成。本文将详细介绍如何部署 Dify 并将其集成到钉钉群聊机器人和企业微信中,帮助您轻松实现 AI 应用的定义与数据运营,提升工作效率。
轻松集成私有化部署Dify文本生成型应用
|
1月前
|
人工智能 数据可视化 开发者
FlowiseAI:34K Star!集成多种模型和100+组件的 LLM 应用低代码开发平台,拖拽组件轻松构建程序
FlowiseAI 是一款开源的低代码工具,通过拖拽可视化组件,用户可以快速构建自定义的 LLM 应用程序,支持多模型集成和记忆功能。
139 14
FlowiseAI:34K Star!集成多种模型和100+组件的 LLM 应用低代码开发平台,拖拽组件轻松构建程序
|
4月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
325 0
安卓项目:app注册/登录界面设计
|
4月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
133 1
|
4月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
3月前
|
jenkins 测试技术 持续交付
探索自动化测试在持续集成中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是持续集成(CI)环境中的关键作用。通过分析自动化测试的优势、实施策略以及面临的主要挑战,旨在为开发团队提供实用的指导和建议。文章不仅概述了自动化测试的基本原理和最佳实践,还详细讨论了如何克服实施过程中遇到的技术难题和管理障碍,以实现更高效、更可靠的软件交付。
104 19

热门文章

最新文章

  • 1
    android FragmentManager 删除所有Fragment 重建
    15
  • 2
    Android实战经验之Kotlin中快速实现MVI架构
    21
  • 3
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    24
  • 4
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    39
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    122
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    40
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 8
    Android历史版本与APK文件结构
    149
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40
  • 推荐镜像

    更多