在Android App中集成Google登陸

技術文章 來源:碼農網 發佈:2016-09-19 瀏覽:194php

摘要:今天,幾乎全部的web和移動app都自帶谷歌和Facebook登陸,這對app開發者和用戶來講是一個很是有用的功能,由於幾乎每一個人都有一個谷歌/ Gmail和Facebook賬戶,此外在用谷歌登陸的時候,你不須要記住你的用戶ID和密碼。

今天,幾乎全部的web和移動app都自帶谷歌和Facebook登陸,這對app開發者和用戶來講是一個很是有用的功能,由於幾乎每一個人都有一個谷歌/ Gmail和Facebook賬戶,此外在用谷歌登陸的時候,你不須要記住你的用戶ID和密碼。html

準備工做

  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。java

爲了更新/安裝Google Play Services SDK:linux

  1. 在Android Studio中,選擇Tools > Android > SDK Manager。
  2. 滾動到軟件包列表的底部,選擇Extras > Google Play services。

獲取配置文件


配置文件可爲你的app提供特定的服務信息。轉到谷歌開發者頁面。爲此,你必須爲你的app選擇現有項目或建立一個新的項目。你還須要爲你的app提供軟件包名稱。android

一、在Android Studio Project中建立一個新項目。將項目命名爲GLogin並給它一個軟件包的名稱。選擇活動名稱爲LoginActivity。web

二、如今添加app名稱和軟件包名稱到谷歌開發者頁面,以下圖所示。json

三、點擊Choose and configure services按鈕。ubuntu

四、選擇Google Sign-In服務頁面。windows

咱們還將繼續在此頁面上工做,但首先,咱們必須生成數字簽名的公共證書。api

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

接下來,咱們須要承載來自於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編輯修改或補充。
相關文章
相關標籤/搜索