在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,一经查实,立即删除!

相关文章

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:在…

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

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

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

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

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

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

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…

[deviceone开发]-do_SlideListView的简单示例

一、简介 利用提供的SlideListVIew实现那种cell可以滑动露出底部按钮的功能 主要组件&#xff1a;do_slidelistview 二、效果图 三、相关讨论 http://bbs.deviceone.net/forum.php?modviewthread&tid269 四、相关下载 https://github.com/do-project/code4do/tree/master/…

Git:Rebase和Merge之间的区别,看完这篇文章你就懂了!

社区中长期以来一直在争论我们应该使用Merge还是Rebase。有人会说Merge更好&#xff0c;因为它保留了最完整的工作历史。其他人则认为&#xff0c;Rebase变得更整洁&#xff0c;这使审阅者的生活更轻松&#xff0c;更高效。本文将解释合并和重新设置之间的区别是什么&#xff0…

干货:SQLServer数据库基于PowerDesigner逆向工程生成PDM文件

在日常的开发工程中&#xff0c;很多时候需要提供数据库设计文档&#xff0c;如果当时数据库设计没有采用PowerDesinger&#xff0c;到后期需要给客户提供数据库设计文档、后期项目运维就会比较麻烦&#xff0c;今天给大家介绍如何使用PowerDesigner的逆向工程生成SQLServer数据…

SQLServer基础:TOP、OFFSET-FETCH、SET ROWCOUNT用法笔记

今天给大家介绍一下TOP、OFFSET-FETCH、SET ROWCOUNT用法笔记&#xff0c;希望对大家能有所帮助&#xff01;1、 TOP用法语法格式&#xff1a;TOP ( expression ) [ PERCENT ] [ WITH TIES ]expression&#xff1a;返回行数的数值表达式PERCENT&#xff1a;指返回的结果集行的百…

取本地数据_深入理解Kafka服务端之Follower副本如何同步Leader副本的数据

一、场景分析Kafka采用的是主写主读的方式&#xff0c;即客户端的读写请求都由分区的Leader副本处理&#xff0c;那么Follower副本要想保证和Leader副本数据一致&#xff0c;就需要不断地从Leader副本拉取消息来进行同步。由于同一个分区的Leader副本和Follower副本分布在不同的…

SQLServer子查询相关知识笔记

今天给大家介绍以下SQLServer子查询相关知识&#xff0c;希望对大家能有所帮助&#xff01;1、子查询概念介绍子查询可以嵌套在SELECT、INSERT、UPDATE、DELETE语句或其他子查询语句中的查询&#xff0c;子查询一般作为查询中间结果集角色&#xff0c;子查询也称为内部查询或内…