在《接入指南:一文帶你瞭解華爲帳號服務》中已經給大家介紹了華爲帳號服務有哪些優勢,如一鍵授權登錄華爲全場景共享、共享華爲帳號所有用戶資源、帳號安全可靠、接入方便快捷等,以及爲什麼能幫助開發者提高獲客量,文章最後還提供了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()取消應用授權。
華爲帳號服務相關鏈接:
>>視頻講解(請參考HMS 4.0視頻講解)
原文鏈接:https://developer.huawei.com/consumer/cn/forum/topic/0201524776948490132?fid=18
原作者:胡椒