Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android資訊 >> 在Android App中集成Google登錄

在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提供軟件包名稱。

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內的LinearLayoutRelativeLayoutLinearLayout包含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中的文件的代碼。
此方法接受位圖圖像,並返回如視頻所示的圓角圖像。

接下來,我們需要承載來自於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。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved