评论

收藏

[Android] 【Codelabs挑战赛示例讲解1】核酸检测结果认证查询系统-认证登录

移动开发 移动开发 发布于:2022-04-18 15:59 | 阅读数:582 | 评论:0

核酸检测结果包含个人隐私数据且数据量较大,如何在云端让核酸检测人员实现海量数据的安全存储/查询成为了核酸检测数据存储的首要难题。华为AppGallery Connect提供了认证服务和云数据库服务两大Serverless服务,可分别实现用户认证登录、数据写入/查询等基本端云协同功能,可完美解决核酸检测数据查询/存储问题,并可通过安全的身份验证功能保证数据的安全性。
《Codelabs挑战赛——零基础搭建认证查询系统》活动正在火热进行中,分享作品有机会获得华为freebuds pro无线耳机、华为手环6nfc版、联盟背包等丰厚大礼,快来参与吧>>https://developer.huawei.com/consumer/cn/forum/topic/0202851788421280176?fid=0102822233052010012
本文从上述需求及业务痛点出发,利用认证服务和云数据库两大Serverless服务,构建了核酸检测结果认证查询系统,系统功能及技术选型如下:
DSC0000.png

开发准备
开通服务
使用AppGallery Connect (简称AGC)的服务,需要在AGC管理台上开通(在AGC控制台上可以一站式体验AGC提供的所有服务)。开通服务之前需要先注册华为开发者帐号,按照指导文档即可,在此不再赘述。
本文主要介绍系统的登录认证功能,故仅介绍对应服务-认证服务在应用中的开通。开通服务前需要创建对应的项目和项目下的应用:
1. 登录AGC管理台,点击“我的项目”,选择“添加项目”,填写项目名称。
DSC0001.png
2. 点击跳转到的项目设置页面的“添加应用”,填写应用信息后确认。
DSC0002.png
至此,项目及项目下的应用便创建完成了。
3. 在菜单目录下找打“构建-认证服务”,点击右上角“立即开通”,选择数据处理位置(数据处理位置即为期望的处理您应用及用户的数据的存储位置),国内一般选择“中国”。然后,选择启用“手机号码”这一认证方式。
DSC0003.png
至此,认证服务已经开通成功了。
集成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文件要重新下载放入。
DSC0004.png
界面设计
简单来说,使用手机帐号借助认证服务完成登录认证功能对界面的要求只有以下两点:具备必要的注册界面(包括帐号、密码和验证码的输入)和具备必要的登录界面即可(此次我使用的是验证码登录,故有账号输入和验证码输入即可),示例界面及代码如下:
注册界面:
DSC0005.png
登录界面:
DSC0006.png
帐号注册
核酸检测查询系统应具备完整的帐号注册和登录的功能,保证系统的安全性和可靠性。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”即表示验证码申请成功,接收到的验证码示例如下:
DSC0007.png
在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参考:
https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-References/agconnectauth-0000001054482530
开发准备和集成SDK必读:
https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-get-started-android-0000001058210705
附另一篇示例讲解:【Codelabs挑战赛示例讲解2】核酸检测结果认证查询系统-数据导入与查询