Android 开发之App中集成Google登录
白羽 2018-06-27 来源 :网络 阅读 1029 评论 0

摘要:本文将带你了解Android 开发之App中集成Google登录,希望本文对大家学Android有所帮助。





今天,几乎所有的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提供软件包名称。

 Android 开发之App中集成Google登录

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

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

 Android 开发之App中集成Google登录

3、点击Choose and configure services按钮。


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

 Android 开发之App中集成Google登录

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

生成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

 Android 开发之App中集成Google登录

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

4.点击ENABLE SIGN IN按钮

5.单击CONTINUE TO GENERATE CONFIGURATION FILE按钮

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

 Android 开发之App中集成Google登录

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

 Android 开发之App中集成Google登录

添加功能

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。

 Android 开发之App中集成Google登录

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

fragment_gplus.xml

<LinearLayout xmlns:android="//schemas.android.com/apk/res/android"

    xmlns:tools="//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="//schemas.android.com/apk/res/android"

    xmlns:tools="//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频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程