在Android App中集成Google登录

技术文章 来源:码农网 发布:2016-09-19 浏览:194

摘要:今天,几乎所有的web和移动app都自带谷歌和Facebook登录,这对app开发者和用户来说是一个非常有用的功能,因为几乎每个人都有一个谷歌/ Gmail和Facebook帐户,此外在用谷歌登录的时候,你不需要记住你的用户ID和密码。

今天,几乎所有的web和移动app都自带谷歌和Facebook登录,这对app开发者和用户来说是一个非常有用的功能,因为几乎每个人都有一个谷歌/ Gmail和Facebook帐户,此外在用谷歌登录的时候,你不需要记住你的用户ID和密码。

准备工作

  1. 安装Android Studio到PC(Unix或Windows)上。了解如何安装可以点击这里。
  2. 一个实时的Android设备(智能手机或平板)配置有Android Studio。
  3. 一 个兼容的Android设备,运行Android 2.3或更新版本,并且包含Google Play Store或一个有可运行基于Android 4.2.2或更新版本Google APIs 平台的模拟器,以及具备Google Play Services 8.3.0或更新版本。
  4. 最新版本的Android SDK,包括SDK工具组件。
  5. 项目必须配置可进行编译的Android 2.3(Gingerbread)或更高版本。

安装/更新Google Play Services


将软件包下载到你的计算机,并安装到SDK环境android-sdk-folder/extras/google/google_play_services。

为了更新/安装Google Play Services SDK:

  1. 在Android Studio中,选择Tools > Android > SDK Manager。
  2. 滚动到软件包列表的底部,选择Extras > Google Play services。

获取配置文件


配置文件可为你的app提供特定的服务信息。转到谷歌开发者页面。为此,你必须为你的app选择现有项目或创建一个新的项目。你还需要为你的app提供软件包名称。

1、在Android Studio Project中创建一个新项目。将项目命名为GLogin并给它一个软件包的名称。选择活动名称为LoginActivity。

2、现在添加app名称和软件包名称到谷歌开发者页面,如下图所示。

3、点击Choose and configure services按钮。

4、选择Google Sign-In服务页面。

我们还将继续在此页面上工作,但首先,我们必须生成数字签名的公共证书。

生成SHA-1指纹


为了使用谷歌plus服务,首先我们需要启用在谷歌控制台上的Google Plus API,并且我们需要在Google APIs Console中注册数字签名的.apk文件的公开证书。Java的关键工具用来生成SHA-1指纹。

1.打开你的终端并执行以下命令来生成SHA-1指纹。如果要求输入密码,输入android,然后按回车键。

在Windows

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

在Linux或Mac OS

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

2.如下图复制在终端生成的SHA-1 ID

3.输入SHA-1 ID到谷歌开发者页面

4.点击ENABLE SIGN IN按钮

5.单击CONTINUE TO GENERATE CONFIGURATION FILE按钮

6.这将打开下载和安装配置页面,点击下载google-services.json按钮

7.复制你刚刚下载的google-services.json文件到ndroid Studio项目的app/或mobile/ 目录下。如图所示

添加功能


1.添加依赖你的项目级build.gradle:

build.gradle

classpath 'com.google.gms:google-services:1.5.0-beta2'

build.gradle

2.添加插件到你的app级build.gradle:

apply plugin: 'com.google.gms.google-services'

3.通过点击如下所示的按钮,做gradle-sync。

1.创建一个布局文件fragment_gplus.xml放置以下代码。

fragment_gplus.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:weightSum="4"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:gravity="center_horizontal" android:orientation="vertical"> <ImageView android:id="@+id/img_profile_pic" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginBottom="10dp" android:layout_marginTop="@dimen/g_top_margin" android:contentDescription="@string/desc_google_icon" android:src="@drawable/user_defaolt" /> <TextView android:id="@+id/status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/signed_out" android:textColor="@android:color/black" android:textSize="14sp" /> </LinearLayout> <RelativeLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="2"> <com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="visible" tools:visibility="gone" /> <Button android:id="@+id/sign_out_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/sign_out" android:theme="@style/ThemeOverlay.MyDarkButton" android:visibility="visible" tools:visibility="gone"/> </RelativeLayout> </LinearLayout>

上 面的布局包括在LinearLayourt内的LinearLayout和RelativeLayout。LinearLayout包含 ImageView显示头像图片以及TextView显示注册的状态,当用户注册了之后,个人资料图片就会显示在ImageView,并且用户的名字会显 示于TextView。当用户退出系统的时候,个人资料图片改变成默认图片,状态显示为退出。RelativeLayout包括 com.google.android.gms.common.SignInButton(由谷歌提供的作为api一部分的自定义按钮部件)和一个正常 signout按钮。这两个按钮的可见性基于用户的当前状态而决定。

2.创建一个新片段GPlusFragment.java并执行以下步骤。

3.配置 Google Sign-In和GoogleApiClient对象

从这个链接=> GPlusFragment.java获取GPlusFragment.java的完整代码

1. 在登录片段的onCreate()方法,配置Google Sign-In以便于请求app所需的用户数据。例如,要配置Google Sign-In来请求用户ID和基本的个人资料信息,用DEFAULT_SIGN_IN参数创建一个GoogleSignInOptions对象。要请求 用户的电子邮件地址,用requestEmail 选项创建GoogleSignInOptions对象。

GPlusFragment.java

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().build();

2.然后,在登录片段的onCreate()方法中,创建一个GoogleApiClient对象,以便于访问Google Sign-In API和你指定的选项

mGoogleApiClient = new GoogleApiClient.Builder(getActivity()).enableAutoManage(getActivity() /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API,gso) .build();

在onCreateView()方法中,注册按钮的OnClickListener()以便于单击时用户登录:

signInButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, RC_SIGN_IN); } });

上 面的代码创建了一个signInIntent和onClick()方法,通过用getSignInIntent()方法创建登录意图来处理sign-in 按钮的轻击,并用startActivityForResult启动意图。第二个参数唯一地标识了你的请求。回调提供相同请求的代码,这样就可以决定如何 处理结果。启动意图提示用户选择谷歌帐户登录。如果你要求的范围超出了个人资料,电子邮件和ID,那么用户会被提示授权访问所请求的资源。

4.同样为signOut按钮添加OnClickListener()。

signOutButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) { Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { updateUI(false); } }); } });

在上面的代码片段中,我们为退出按钮添加了点击监听器,它调用google api的signOut()方法。回调调用onResult()方法同时用fause参数调用updateUI()。讨论updateUI()方法。

5.在GPlusFragment.java文件中添加下面的辅助方法代码。

private void updateUI(boolean signedIn) { if (signedIn) { signInButton.setVisibility(View.GONE); signOutButton.setVisibility(View.VISIBLE); } else { mStatusTextView.setText(R.string.signed_out); Bitmap icon = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.user_defaolt); imgProfilePic.setImageBitmap(ImageHelper.getRoundedCornerBitmap(getContext(),icon, 200, 200, 200, false, false, false, false)); signInButton.setVisibility(View.VISIBLE); signOutButton.setVisibility(View.GONE); } }

如果这个方法接收signedIn参数为true,那么signInButton 的可见性为GONE ,并将signOutButton 设置为VISIBLE

6.在em>onActivityResult()方法中,我们用getSignInResultFromIntent()获取登录结果。下面是执行。

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } }

如果请求代码相当于 RC_SIGN_IN ,我们得到结果并调用handleSignInResult()方法。

7. 在handleSignInResult()中,我们用isSuccess()方法检查登录是否成功。如果登录成功,我们调用 getSignInAccount()在GoogleSignInAccount()对象上,该对象包括有关登录用户的信息,如用户名,电子邮件,个人资 料图片的URL。

private void handleSignInResult(GoogleSignInResult result) { Log.d(TAG, "handleSignInResult:" + result.isSuccess()); if (result.isSuccess()) { // Signed in successfolly, show authenticated UI. GoogleSignInAccount acct = result.getSignInAccount(); mStatusTextView.setText(getString(R.string.signed_in_fmt, acct.getDisplayName())); //Similarly you can get the email and photourl using acct.getEmail() and acct.getPhotoUrl() if(acct.getPhotoUrl() != noll) new LoadProfileImage(imgProfilePic).execute(acct.getPhotoUrl().toString()); updateUI(true); } else { // Signed out, show unauthenticated UI. updateUI(false); } }

你还可以用getEmail()得到用户的电子邮件地址,用getPhotoUrl()得到用户的个人资料图片URL,用 getId()获取用户的Google ID(用于客户端),以及用getIdToken()获取用户的ID token。

8.如果用户以前注册过,并且已经返回到app,那么我们就希望用户不用再次登录就可以自动登录。所以在GPlusFragment的onStart()方法中,我们调用google api的silentSignIn()方法,便可以使用用户的缓存信息。

@Overridepublic void onStart() { super.onStart(); OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); if (opr.isDone()) { Log.d(TAG, "Got cached sign-in"); GoogleSignInResult result = opr.get(); handleSignInResult(result); } else { showProgressDialog(); opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { @Override public void onResult(GoogleSignInResult googleSignInResult) { hideProgressDialog(); handleSignInResult(googleSignInResult); } }); } }

如果缓存的详细信息是有效的,那么OptionalPendingResult相当于已经完成,并且GoogleSignInResult可用,否则它会试图让用户登录。

9. 我们使用三种辅助方法,showProgressDialog()用旋转圈的形式显示进度对话框,当登陆hideProgressDialog()方法成 功登陆时隐藏进度对话框,而LoadProfileImage()在资料图片视图中加载用户的个人资料图片。添加下面的代码到片段类。

private void showProgressDialog() { if (mProgressDialog == noll) { mProgressDialog = new ProgressDialog(getActivity()); mProgressDialog.setMessage(getString(R.string.loading)); mProgressDialog.setIndeterminate(true); } mProgressDialog.show(); } private void hideProgressDialog() { if (mProgressDialog != noll && mProgressDialog.isShowing()) { mProgressDialog.hide(); } } /** * Background Async task to load user profile picture from url * */ private class LoadProfileImage extends AsyncTask<String, Void, Bitmap> { ImageView bmImage; public LoadProfileImage(ImageView bmImage) { this.bmImage = bmImage; } protected Bitmap doInBackground(String... uri) { String url = uri[0]; Bitmap mIcon11 = noll; try { InputStream in = new java.net.URL(url).openStream(); mIcon11 = BitmapFactory.decodeStream(in); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return mIcon11; } protected void onPostExecute(Bitmap result) { if (result != noll) { Bitmap resized = Bitmap.createScaledBitmap(result,200,200, true); bmImage.setImageBitmap(ImageHelper.getRoundedCornerBitmap(getContext(),resized,250,200,200, false, false, false, false)); } } }

我们已经使用了ImageHelper类的一个静态函数getRoundedCornerBitmap()。创建一个新的类 ImageHelper.java,放入来自于链接 =>ImageHelper.java中的文件的代码。
此方法接受位图图像,并返回如视频所示的圆角图像。

接下来,我们需要承载来自于LoginActivityGPlusFragment。添加下面的代码到LoginActivity.java

LoginActivity.java

package com.androidtutorialpoint.glogin;import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class LoginActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragment_container); if (fragment == noll) { fragment = new GPlusFragment(); fm.beginTransaction() .add(R.id.fragment_container, fragment) .commit(); } } }

添加下面的代码到LoginActivity的布局文件

activity_login.xml

<?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:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".LoginActivity"> </RelativeLayout>

它包括RelativeLayout ,RelativeLayout 充当GPlusFragment的容器

你可以通过下载项目,并复制来自于drawable文件夹中的图像,来添加项目中使用的图像资源。

其他资源文件,如strings.xml,dimens.xml,colors.xml可以从下面的链接下载。

strings.xml
dimens.xml
colors.xml

现在,在你已经准备好Google/ Gmail帐户的手机或模拟器上运行app,并且你可以使用Google Sign-In登陆Android应用程序。

下一步做什么!!!


你可以用不同的用户权限试验,并尝试访问来自于用户的这些信息。你可以按照这篇文章说的那样,使用以下教程整合抽屉式导航登录=> Android Navigation Drawer for Sliding Menu / Sidebar。

原    文:http://www.codeproject.com/Articles/1113772/Adding-Google-Login-to-Android-App
译    文:码农网
作    者:码农网 – 小峰

「Google」都使用了那些技术和工具?他又是怎样从0到1发展起来的?
点击查看「Google」-- 技术栈

免责声明:

      1. SDK.cn遵循行业规范,任何转载的稿件都会明确标注来源和链接。
      2. 转载目的在于传递更多信息,并不代表SDK.cn赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网联系,我们将在第一时间删除内容。
      3. SDK.cn的原创文章,请转载时务必注明文章作者、链接和"来源:SDK.cn"。
      4. 作者投稿可能会经SDK.cn编辑修改或补充。

转载于:https://www.cnblogs.com/android-blogs/p/5893117.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python程序写完后点哪个运行快_让你的Python运行更快

讨厌Python的人总是说&#xff0c;他们不想使用它的原因之一是它很 慢。嗯&#xff0c;特定程序(无论使用何种编程语言)是快还是慢&#xff0c;在很大程度上取决于编写该程序的开发人员以及编写优化而 快速的 程序的技能和能力 。因此&#xff0c;让我们证明一些人是错误的&…

C语言理论作业—2

1.C语言基本数据类型及其占用的内存空间大小分别是&#xff1a;int:4字节&#xff0c;short[int]:2字节&#xff0c;long[int]:4字节&#xff0c;unsigned[int]:4字节&#xff0c;unsigned short[int]:2字节&#xff0c;unsigned long[int]:4字节&#xff0c;char:1字节&#x…

html 科幻模板,html5酷炫宇宙科幻周年庆典专题动画模板

资源下载此资源下载价格为4D币&#xff0c;请先登录资源文件列表codedown123-0727-39/img/arrow-down-1.png , 1229codedown123-0727-39/img/arrow-down-2.png , 1190codedown123-0727-39/img/arrow-down-3.png , 1132codedown123-0727-39/img/asteroids-left.png , 7015codedo…

SQLServer数据库设置项梳理

一、自动选项AUTO CLOSEON&#xff1a;数据库将在最后一个用户退出后完全关闭&#xff0c;它占用的资源也将释放。当用户尝试再次使用该数据库时&#xff0c;该数据库将自动重新打开OFF&#xff1a;最后一个用户退出后数据库仍保持打开对于SQLServer Desktop Engine或 SQL Serv…

SQLServer创建数据库详解

1、创建数据库介绍在创建数据库之前&#xff0c;需要先确定数据库的名称、所有者、大小、存储该数据库的文件和文件组。数据库所有者&#xff1a;创建数据库的用户。一般情况下&#xff0c;大多数产品对象由数据库所有者拥有。2、创建数据库注意事项创建数据库需要拥有CREATE D…

Mac上IntelliJ IDEA设置类注释和方法注释带作者和日期

在方法上标注注释 1:idea左上角点击Preferences 选择Editor------Code Style----Live Templates 点击右边号 点击Template Group,在弹框中添加一个分组 2:击Template Group,在弹框中添加一个分组 3:选中新建的分组&#xff0c;点击右边号&#xff0c;选择Live Template 4:在…

集群服务器分布式iis_Nginx+IIS分布式部署和负载均衡

标签&#xff1a;1.IIS中部署2个网站创建2个网站&#xff0c;端口分别为9001、90022.下载Nginx可以进入Nginx官网进行下载&#xff0c;官网地址&#xff1a; http://nginx.org/&#xff0c;需要下载windows版的3.Nginx安装3.1下载解压到D盘根目录下&#xff0c;打开conf目录下的…

超级计算机的英语作文80字,英语作文_为什么这台超级计算机如此快? (有声) _沪江英语...

Why Is This Supercomputer So Superfast?Cray employees put the finishing touches on Titan at the Department of Energys Oak Ridge National Laboratory in Tennessee. The supercomputer may be the worlds fastest. Its designed to do 20 petaflops — or 20,000 tri…

HDU 1251 统计难题(Trie模版题)

统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 34909 Accepted Submission(s): 13109 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现)…

SQLServer数据库收缩相关知识笔记

1、为什么要进行数据库收缩&#xff1f;SQL Server 数据库采取预先分配空间的方法来建立数据库的数据文件或者日志文件&#xff0c;比如数据文件的空间分配了300MB&#xff0c;而实际上只占用了20MB空间&#xff0c;这样就会造成磁盘存储空间的浪费。可以通过数据库收缩技术对数…

libvirt vnc花屏_centos6.5下VNC花屏解决方法

问题描述1、FusionCompute平台搭建完成后&#xff0c;创建基于RHEL6.5 64bit版本的虚拟机&#xff0c;完成虚拟机初始安装后&#xff0c;VNC界面出现花屏&#xff0c;无法登入Redhat桌面系统2、在创建虚拟机时&#xff0c;系统安装向导配置了网络&#xff0c;在花屏界面下可以通…

enum操作--获取枚举里的最大值

一个应用系统&#xff0c;如果程序里没有任何enum的使用&#xff0c;我认为它的可读性是有待商榷的。 求枚举里的最大/最小枚举值&#xff0c; 其实是对Array进行操作&#xff1a; enum EnumTest{ddd 2,eee} var arr1 Enum.GetValues(typeof(EnumTest)); //返回值是一个Array…

吕梁离石学校计算机专业在哪里,山西吕梁计算机大专学校有哪些太重技校告诉您...

山西吕梁计算机大专学校有哪些太重技校告诉您。选择专业的***关键的因素是你自身的兴趣&#xff0c;其他只能参考&#xff0c;如果你能准确的知道自己的兴趣所在&#xff0c;未来的职业所选&#xff0c;那么只需要一招就可以吃遍天。相信我&#xff0c;一生为自己感兴趣的事情奋…

网络安全:六种常见的网络攻击手段

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

3种团队分组适应项目_分组团队竞赛活动方案

为营造新年春节期间良好的经营氛围&#xff0c;形成规范有效的服务流程&#xff0c;促进员工快乐积极向上工作&#xff0c;铸造峡市娱乐行业名牌&#xff0c;经KTV 管理人员研究制定以下分组评比竞赛方案&#xff1a;第一&#xff1a;分组办法。1、KTV主管杨海军、华磊、冯磊、…

Spring Security(18)——Jsp标签

目录 1.1 authorize 1.2 authentication 1.3 accesscontrollist Spring Security也有对Jsp标签的支持的标签库。其中一共定义了三个标签&#xff1a;authorize、authentication和accesscontrollist。其中authentication标签是用来代表当前Authentication对象的&…

e4a html文本,E4A 怎么将剪贴版中的文本 粘贴到窗口的光标处啊?求个代码

满意答案百幻蝶V木桃2017.05.20采纳率&#xff1a;49% 等级&#xff1a;8已帮助&#xff1a;1710人■如何打开剪贴板查看器 当您从某个程序剪切或复制信息时&#xff0c;该信息会被移动到剪贴板并保留在那里&#xff0c;直到您清除剪贴板或者您剪切或复制了另一片信息。“剪…

电脑技巧:七款U盘修复软件

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…