技術文章 來源:碼農網 發布: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編輯修改或補充。