核酸檢測結果包含個人隱私數據且數據量較大,如何在雲端讓核酸檢測人員實現海量數據的安全存儲/查詢成為了核酸檢測數據存儲的首要難題。華為AppGallery Connect提供了認證服務和雲資料庫服務兩大Serverless服務,可分別實現用戶認證登錄、數據寫入/查詢等基本端雲協同功能,可完美解決核酸檢 ...
核酸檢測結果包含個人隱私數據且數據量較大,如何在雲端讓核酸檢測人員實現海量數據的安全存儲/查詢成為了核酸檢測數據存儲的首要難題。華為AppGallery Connect提供了認證服務和雲資料庫服務兩大Serverless服務,可分別實現用戶認證登錄、數據寫入/查詢等基本端雲協同功能,可完美解決核酸檢測數據查詢/存儲問題,並可通過安全的身份驗證功能保證數據的安全性。
《Codelabs挑戰賽——零基礎搭建認證查詢系統》活動正在火熱進行中,分享作品有機會獲得華為freebuds pro無線耳機、華為手環6nfc版、聯盟背包等豐厚大禮,快來參與吧>>https://developer.huawei.com/consumer/cn/forum/topic/0202851788421280176?fid=0102822233052010012
本文從上述需求及業務痛點出發,利用認證服務和雲資料庫兩大Serverless服務,構建了核酸檢測結果認證查詢系統,系統功能及技術選型如下:
開發準備
開通服務
使用AppGallery Connect (簡稱AGC)的服務,需要在AGC管理台上開通(在AGC控制臺上可以一站式體驗AGC提供的所有服務)。開通服務之前需要先註冊華為開發者帳號,按照指導文檔即可,在此不再贅述。
本文主要介紹系統的登錄認證功能,故僅介紹對應服務-認證服務在應用中的開通。開通服務前需要創建對應的項目和項目下的應用:
1. 登錄AGC管理台,點擊“我的項目”,選擇“添加項目”,填寫項目名稱。
2. 點擊跳轉到的項目設置頁面的“添加應用”,填寫應用信息後確認。
至此,項目及項目下的應用便創建完成了。
3. 在菜單目錄下找打“構建-認證服務”,點擊右上角“立即開通”,選擇數據處理位置(數據處理位置即為期望的處理您應用及用戶的數據的存儲位置),國內一般選擇“中國”。然後,選擇啟用“手機號碼”這一認證方式。
至此,認證服務已經開通成功了。
集成SDK
AGC以SDK的方式開放了其對華為帳號、游戲帳號等帳號的匿名登錄能力,在開發認證功能之前,需要先集成認證服務SDK,且需要下載AGC提供的JSON文件獲取應用的基本信息和數據處理位置信息等。
1.1 集成SDK
當您在Android Studio中創建項目後,在項目中SDK的集成步驟如下:
1. 在項目級build.gradle文件下配置maven倉和AGC插件地址:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
//maven倉地址
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.0"
//AGC插件地址
classpath 'com.huawei.agconnect:agcp:1.6.5.300'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
//maven倉地址
maven {url 'https://developer.huawei.com/repo/'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
2. 在應用級build.gradle文件下配置編譯依賴和認證服務SDK
plugins {
id 'com.android.application'
//添加AGC的依賴
id 'com.huawei.agconnect'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.1"
defaultConfig {
applicationId "com.huawei.covid19detection"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
//agc-core的依賴
implementation 'com.huawei.agconnect:agconnect-core:1.6.5.300'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
//認證服務sdk
implementation 'com.huawei.agconnect:agconnect-auth:1.6.5.300'
}
上述SDK或依賴添加完成後,需要點擊右上角“Sync Now”等待同步完成。
1.2 添加配置文件
為了簡化開發者的配置步驟,向開發者提供了保存應用配置信息的配置文件,只需要將配置文件添加到工程目錄並集成AGC插件,AGC插件可以自動將應用信息載入到開發環境中。
1.打開剛剛創建項目的“項目設置”,下載配置文件“agconnect-services.json”。
2.將下載的JSON文件放到Android Studio項目的應用級目錄下,後續集成雲資料庫後JSON文件要重新下載放入。
界面設計
簡單來說,使用手機帳號藉助認證服務完成登錄認證功能對界面的要求只有以下兩點:具備必要的註冊界面(包括帳號、密碼和驗證碼的輸入)和具備必要的登錄界面即可(此次我使用的是驗證碼登錄,故有賬號輸入和驗證碼輸入即可),示例界面及代碼如下:
註冊界面:
登錄界面:
帳號註冊
核酸檢測查詢系統應具備完整的帳號註冊和登錄的功能,保證系統的安全性和可靠性。AGC認證服務提供了手機帳號註冊的功能,註冊成功後即可快速登錄。
1.查閱官方文檔後發現,註冊手機帳號需要先獲取驗證碼,AGC也提供了獲取驗證碼的介面AGConnectAuth.requestVerifyCode,從API文檔來看,填寫國家碼和手機號,點擊“OBTAIN”即可申請。
findViewById(R.id.verification_code_obtain).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String phoneNumberStr = editText_num.getText().toString().trim();
VerifyCodeSettings settings = new VerifyCodeSettings.Builder()
.action(VerifyCodeSettings.ACTION_REGISTER_LOGIN)
.sendInterval(30)
.locale(Locale.CHINA)
.build();
Task<VerifyCodeResult> task = AGConnectAuth.getInstance().requestVerifyCode(countryCodeStr, phoneNumberStr, settings);
task.addOnSuccessListener(TaskExecutors.uiThread(), new OnSuccessListener<VerifyCodeResult>() {
@Override
public void onSuccess(VerifyCodeResult verifyCodeResult) {
//驗證碼申請成功
Log.d(TAG, "onSuccess: message send successfully"+phoneNumberStr);
Toast.makeText(RegisterActivity.this,"send phone verify code success",Toast.LENGTH_LONG).show();
}
}).addOnFailureListener(TaskExecutors.uiThread(), new OnFailureListener() {
@Override
public void onFailure(Exception e) {
//失敗就銷戶
//AGConnectAuth.getInstance().deleteUser();
Log.e(TAG, "onSuccess: message send failed"+phoneNumberStr);
Toast.makeText(RegisterActivity.this, "requestVerifyCode fail:" + e, Toast.LENGTH_SHORT).show();
}
});
}
});
頁面Toast提示“send phone verify code success”即表示驗證碼申請成功,接收到的驗證碼示例如下:
在EditText中填寫驗證碼,點擊“Rigister”即可註冊成功。
對應為AGConnectAuth.createUser註冊用戶介面。註冊成功後,請前往登錄頁面登錄。
findViewById(R.id.register).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String phoneNumberStr = editText_num.getText().toString().trim();
String vericode = veri_code.getText().toString().trim();
String rePsd = repsd_txt.getText().toString().trim();
PhoneUser phoneUser = new PhoneUser.Builder()
.setCountryCode(countryCodeStr)
.setPhoneNumber(phoneNumberStr)
.setVerifyCode(vericode)
.setPassword(rePsd)
.build();
AGConnectAuth.getInstance().createUser(phoneUser)
.addOnSuccessListener(new OnSuccessListener<SignInResult>() {
@Override
public void onSuccess(SignInResult signInResult) {
//創建帳號成功後,預設已登錄,進入主頁面
Intent intent = new Intent();
intent.setClass(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Toast.makeText(RegisterActivity.this, "register fail:" + e, Toast.LENGTH_SHORT).show();
}
});
}
});
登錄認證
註冊成功後,使用AGC認證服務登錄應用的方式有驗證碼登錄和密碼登錄兩種。此處僅實現了驗證碼登錄,密碼登錄實現請參考指導文檔。
1. 申請驗證碼涉及介面與帳號註冊一致,參考申請即可。
2. 使用獲取的驗證碼生成手機帳號登錄憑證,由於我們並未設置輸入密碼框,此處password參數填null即可。
AGConnectAuthCredential credential = PhoneAuthProvider.credentialWithVerifyCode(countryCodeStr, phoneNumberStr, null, userVeri);
3. 使用生成的帳號憑證登錄應用,詳見AGConnectAuth.signIn。
findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String phoneNumberStr = loginText_num.getText().toString().trim();
String vericode = loginVeri_code.getText().toString().trim();
AGConnectAuthCredential credential = PhoneAuthProvider.credentialWithVerifyCode(countryCodeStr,phoneNumberStr,"",vericode);
AGConnectAuth.getInstance().signIn(credential)
.addOnSuccessListener(new OnSuccessListener<SignInResult>() {
@Override
public void onSuccess(SignInResult signInResult) {
Intent intent = new Intent();
intent.setClass(LoginActivity.this, DatabaseActivity.class);
startActivity(intent);
Log.i(TAG, "onSuccess: login success");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {}
});
}
});
登錄成功後,即可跳轉到應用主界面。主界面展示核酸檢測結果數據,數據的導入及展示我們會在下一篇指導詳細闡述。
總結
使用AGC認證服務通過申請驗證碼的方式進行帳號註冊和登錄整個開發過程主要的工作量在前期的服務開通和SDK集成方面,核心功能代碼開發量不大,SDK大小控制在了MB以內(可參考華為AGC SDK大小大揭秘)。
下篇我們將介紹如何使用AGC的雲資料庫導入/記錄核酸檢測結果數據併進行查詢展示。
參考文檔:
如何使用手機帳號實現應用的註冊登錄:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-auth-android-phone-0000001053333941#section204291139102115
認證服務註冊和登錄相關API參考:
開發準備和集成SDK必讀:
附另一篇示例講解:【Codelabs挑戰賽示例講解2】核酸檢測結果認證查詢系統-數據導入與查詢