在Android App中集成Google登录
技术文章 来源:码农网 发布:2016-09-19 浏览:194

今天,几乎所有的web和移动app都自带谷歌和Facebook登录,这对app开发者和用户来说是一个非常有用的功能,因为几乎每个人都有一个谷歌/ Gmail和Facebook帐户,此外在用谷歌登录的时候,你不需要记住你的用户ID和密码。
准备工作
- 安装Android Studio到PC(Unix或Windows)上。了解如何安装可以点击这里。
- 一个实时的Android设备(智能手机或平板)配置有Android Studio。
- 一 个兼容的Android设备,运行Android 2.3或更新版本,并且包含Google Play Store或一个有可运行基于Android 4.2.2或更新版本Google APIs 平台的模拟器,以及具备Google Play Services 8.3.0或更新版本。
- 最新版本的Android SDK,包括SDK工具组件。
- 项目必须配置可进行编译的Android 2.3(Gingerbread)或更高版本。
安装/更新Google Play Services
将软件包下载到你的计算机,并安装到SDK环境android-sdk-folder/extras/google/google_play_services。
为了更新/安装Google Play Services SDK:
- 在Android Studio中,选择Tools > Android > SDK Manager。
- 滚动到软件包列表的底部,选择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() {
@Override
public 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() {
@Override
public 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()获取登录结果。下面是执行。
@Override
public 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()方法,便可以使用用户的缓存信息。
@Override
public 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中的文件的代码。
此方法接受位图图像,并返回如视频所示的圆角图像。
接下来,我们需要承载来自于LoginActivity的GPlusFragment。添加下面的代码到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」-- 技术栈
免责声明:
- SDK.cn遵循行业规范,任何转载的稿件都会明确标注来源和链接。
- 转载目的在于传递更多信息,并不代表SDK.cn赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网联系,我们将在第一时间删除内容。
- SDK.cn的原创文章,请转载时务必注明文章作者、链接和"来源:SDK.cn"。
- 作者投稿可能会经SDK.cn编辑修改或补充。
在Android App中集成Google登录的更多相关文章
- Android 应用程序集成Google 登录及二次封装
谷歌登录API: https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...
- android应用集成google登录
集成google登录之前需要有一下三点要求,只有具备一下两点要求才能集成google登录: 1,android 运行版本4.0及更新版本 2,android 设 ...
- 在Android应用中实现Google搜索的例子
有一个很简单的方法在你的 Android 应用中实现 Google 搜索.在这个例子中,我们将接受用户的输入作为搜索词,我们将使用到 Intent.ACTION_WEB_SEARCH . Google ...
- 怎么在我们的App中集成条码扫描功能?
现在很多App都有条码扫描功能,有的手机比如某米在照相机中集成了条码扫描功能,但是还有一部分手机没有这样的集成,比如韩国某星,需要自己下载一个条码扫描App.今天我们就来看看怎么在自己的App中集成一 ...
- 【Unity与Android】02-在Unity导出的Android工程中接入Google Admob广告
我在上一篇文章 [Unity与Android]01-Unity与Android交互通信的简易实现) 中介绍了Unity与Android通讯的基本方法. 这一篇开始进入应用阶段,这次要介绍的是如何在An ...
- Android 应用程序集成FaceBook 登录及二次封装
1.首先在Facebook 开发者平台注册一个账号 https://developers.facebook.com/ 开发者后台 https://developers.facebook.com/ap ...
- ShareSDK 集成 Google+ 登录 400. Error:redirect_uri_mismatch 和 Error Domain=ShareSDKErrorDomain Code=204
最近在集成ShareSDK中 Google+ 登录授权时候 出现了如下几个问题 1. 400. Error:redirect_uri_mismatch 出现这种情况, redirectUri应 ...
- Android app中的so库和CPU架构
一.android目前有几种cpu架构? 早期的Android系统几乎只支持ARMv5的CPU架构,目前支持七种CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MI ...
- OpenCV - Android Studio 中集成Opencv环境(包含opencv_contrib部分)
我在上一篇博客中说到了在Android中集成OpenCV,但是那个版本的OpenCV是没有SIFT和SURF算法的,因为这些算法是受专利保护的,所以并没有被包含在预编译库中,所以如果想要使用SIFT和 ...
随机推荐
- 软工实践Alpha冲刺(9/10)
v队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成非功能的主界面制 ...
- beta版本前准备
目录 过去存在的问题 任务分工 开发规范 后端总结 卉卉 家灿 前端总结 绪佩 青元 恺琳 宇恒 丹丹 算法&API接口 家伟 鸿杰 一好 文档&博客撰写 政演 产品功能 我们已经做了 ...
- PAT 1070 结绳
https://pintia.cn/problem-sets/994805260223102976/problems/994805264706813952 给定一段一段的绳子,你需要把它们串成一条绳. ...
- linux服务进程管理
1.查看linux占用内存/CPU最多的进程 查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 或者top (然后按下M,注意大写) 查使用CPU最多的1 ...
- Swift中由找不到removeAll(where:)方法引起的连锁反应(上)
核心代码 section.removeAll {baseRow in if let habitRow = baseRow as? HabitRow{ let idxPath = habitRow.in ...
- python带header
headers = { "Accept":"text/html,application/xhtml+xml,application/xml;", "A ...
- 在AppCode中的razor调用HtmlHelper方法和UrlHelper方法
原文发布时间为:2011-05-17 -- 来源于本人的百度文章 [由搬家工具导入] 可以写一个帮助类,如下 using System.Web.WebPages;using System.Web.Mv ...
- ef unitofwork 主从表更新
readonly UnitOfWork _u = new UnitOfWork(); public M Get(int id) { return _u.T_MtnContractRepository( ...
- 搜索水题四连发_C++
特别声明:以下题目有部分为原创题,涉及版权问题,不得转载,违者追究 法律责任! 话说这是一套神题,只有你想不到,没有你做不到 题目更正后比 Pascal 跑得还快哈~ 一道特别裸,但是特别坑的搜索题 ...
- windows实时监测热插拔设备的变化2
//动态监测设备插拔 #include <Dbt.h> BEGIN_MESSAGE_MAP(ParticipateMeeting, CDialogEx) ON_WM_DEVICECHANG ...