【接入指南】一個Demo帶你玩轉華爲帳號服務

《接入指南:一文帶你瞭解華爲帳號服務》中已經給大家介紹了華爲帳號服務有哪些優勢,如一鍵授權登錄華爲全場景共享、共享華爲帳號所有用戶資源、帳號安全可靠、接入方便快捷等,以及爲什麼能幫助開發者提高獲客量,文章最後還提供了Demo App的下載二維碼讓大家下載體驗華爲帳號的登錄授權流程,Demo非常簡單,集成了3個華爲帳號服務SDK接口(總共4個),本文通過指導大家快速開發此Demo,讓大家熟悉華爲帳號服務。

 

如何你還沒有下載Demo,請使用瀏覽器掃描如下二維碼下載體驗:

(注:Demo中會收集相關操作信息用於用戶數量統計)

Demo開發準備

1、 安裝Android Studio 3.5及以上版本;

2、 安裝JDK 1.8 及以上;

3、 使用SDK Platform 19及以上;

4、 使用Gradle 4.6及以上;

5、 在華爲開發者聯盟註冊成爲華爲開發者,如已註冊,請跳過此步驟;

6、 將github上的demo源代碼下載至本地;

Demo源碼地址:https://github.com/HMS-Core/huawei-account-demo/tree/quickstart

運行環境配置(2min左右)

1、 使用Android Studio打開demo工程;

2、 在安卓插件市場下載HMS Toolkit插件並安裝,版本5.2.0.300或以上;

如何安裝插件也可參考:如何安裝HMS Toolkit

 

3、 在工程中新創建自己的包名,例如com.hxb.account,把demo包com.huawei.hms.accountsample原有代碼移動到新建包下;修改工程中涉及的Package Name和應用ID爲自己新建的包名。(不能直接使用Demo中的包名,該包名已經被其他用戶在華爲應用市場註冊過)

新建自己的包名(新建後注意把相應的Activity等類移到您定義的新包下),便於編譯過程中查找相關文件:

 

 

修改AndroidManifest.xml文件中的package爲com.hxb.account

 

 

修改build.gradle中的applicationId爲com.hxb.account.

 

 

4、 打開HMS菜單下的Configuration Wizard進行環境配置檢查,如果沒有登錄華爲開發者帳號,Toolkit會引導先進行登錄,登錄後再點擊Configuration Wizard。

 

彈出如下頁面,頁面中紅×部分說明Toolkit檢測到華爲開發者聯盟對應開發帳號下沒有對應包名的應用。

 

點擊Link可直接跳轉至開發者聯盟,進行相關應用的創建,這部分需要手動完成,步驟如下:

A、點擊應用發佈

B、點擊添加項目

 

 

C、創建項目

D、點擊添加應用

E、添加項目

 

應用創建完後,點擊Configuration Wizard面板中的Retry,重新進行配置檢查,檢查成功:

 

 

7、 添加Account kit

點擊Configuration Wizard面板中Add Kits,選擇Account kit進行添加

 

添加完結果:

8、 選擇證書,當前選擇Android debug certificate 選項,點擊Generate生成指紋證書,如下圖

 

 

9、 點擊Next,自動進行其他配置,包括在華爲開發者聯盟上開通Account Kit服務開關、配置應用的指紋證書、下載agconnect-services.json文件到工程目錄下、混淆配置、在build.gradle文件插入接入Account SDK所需要的依賴、apk簽名等操作,成功後會顯示Success,如果中途檢查出問題,可按照指引處理。

 

使用Toolkit遠程真機進行打包測試

環境配置完後,調用Toolkit的Cloud Debugging進行打包測試

 

選擇需要使用的機型:

 

選擇對應設備,點擊運行,即可進行App測試:

 

Demo核心代碼詳解

1、 界面設計

帳號的交互接口主要涉及登錄、靜默登錄、退出帳號、取消授權,Demo中展示了登錄、靜默登錄、取消授權三個接口的使用。

 

 

其中“華爲帳號登錄”圖標使用的是已經封裝好的標準控件,實際使用時請按照華爲帳號登錄圖標使用規範使用華爲圖標

<com.huawei.hms.support.hwid.ui.HuaweiIdAuthButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

1、 帳號授權功能核心代碼

 

(1)   帳號登錄

場景介紹:帳號登錄基於OAuth 2.0協議標準OpenID Connect協議,支持Authorization Code和ID Token兩種登錄模式,Authorization Code模式僅適用於有自己服務器的應用,ID Token模式同時適用於單機應用和有自己服務器的應用,您可根據實際情況選擇其中一種模式實現。

private void signIn() {
    mAuthParam = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM)
          .setIdToken()
          .setAccessToken()
          .createParams();
    mAuthManager = AccountAuthManager.getService(AccountActivity.this, mAuthParam);
    startActivityForResult(mAuthManager.getSignInIntent(), Constant.REQUEST_SIGN_IN_LOGIN);
 }

代碼中setIdToken()表示使用ID-Token方式進行授權,另一種方式爲setAuthorizationCode(),兩者的區別後續文章會詳細介紹,getSignInIntent()爲帳號登錄授權接口。

登錄授權完成後處理登錄結果:

 

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == Constant.REQUEST_SIGN_IN_LOGIN) {
       //login success
       //get user message by parseAuthResultFromIntent
       Task<AuthAccount> authAccountTask = AccountAuthManager.parseAuthResultFromIntent(data);
       if (authAccountTask.isSuccessful()) {
          AuthAccount authAccount = authAccountTask.getResult();
          Log.i(TAG, authAccount.getDisplayName() + " signIn success ");
          Log.i(TAG, "AccessToken:\n" + authAccount.getAccessToken());
          Log.i(TAG, "OpenId:\n" + authAccount.getOpenId());
          Log.i(TAG, "Email:\n" + authAccount.getEmail());
          Log.i(TAG, "UnionId:\n" + authAccount.getUnionId());
     //download avatar use AsyncTask
          NetService = new NetService(new URLPostHandler() {
             @Override
             public void PostHandler(Bitmap bitmap) {
                imageView.setImageBitmap(bitmap);
                textView.setText(authAccount.getDisplayName());
             }
          });
          netService.execute(authAccount.getAvatarUriString());
       } else {
          Log.i(TAG, "signIn failed: " + ((ApiException) 
     authAccountTask.getException()).getStatusCode());
       }
    }
 }

(2)   靜默登錄

場景介紹:用戶首次使用帳號登錄應用後,再次登錄時,無需重複授權

private void silentSignIn() {
    Task<AuthAccount> task = mAuthManager.silentSignIn();
    task.addOnSuccessListener(new OnSuccessListener<AuthAccount>() {
       @Override
       public void onSuccess(AuthAccount authAccount) {
          Log.i(TAG, "silentSignIn success");
       }
    });
    task.addOnFailureListener(new OnFailureListener() {
       @Override
       public void onFailure(Exception e) {
          //if Failed use getSignInIntent
          if (e instanceof ApiException) {
             ApiException apiException = (ApiException) e;
             signIn();
          }
       }
    });
 }

代碼中調用silentSignIn()進行帳號靜默登錄。

 

(3)   取消授權

場景介紹:爲了提升應用隱私安全,應用可以提供入口,供用戶取消對應用的授權。

private void cancelAuthorization() {
    Task<Void> task = mAuthManager.cancelAuthorization();
    task.addOnSuccessListener(new OnSuccessListener<Void>() {
       @Override
       public void onSuccess(Void aVoid) {
   imageView.setImageDrawable(null);
          textView.setText("");
          Log.i(TAG, "cancelAuthorization success");
       }
    });
    task.addOnFailureListener(new OnFailureListener() {
       @Override
       public void onFailure(Exception e) {
          Log.i(TAG, "cancelAuthorization failure:" + e.getClass().getSimpleName());
       }
    });
 }

代碼中調用cancelAuthorization()取消應用授權。

 

 

華爲帳號服務相關鏈接:

>>華爲帳號服務詳細指導文檔

>>codelab接入指導

>>視頻講解(請參考HMS 4.0視頻講解)

 

 

原文鏈接:https://developer.huawei.com/consumer/cn/forum/topic/0201524776948490132?fid=18

原作者:胡椒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章