安卓登入华为账号获取授权全过程
1.第一步创建一个安卓项目
2.创建完我们先把登入页面的前端ui写出来(源码放在下方)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20px"
>
<Button
android:id="@+id/bt_id_token"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登入"
/>
<Button
android:id="@+id/account_siqnout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="退出"
/>
<Button
android:id="@+id/cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="取消"
/>
</LinearLayout>
3.现在架构已经创建完,现在我们先要创建jks密钥(用来跟华为开发者联盟个人项目之间进行串联的密钥)
- 注意该密钥要创建在本项目的app下
- 所有的信息填写完点击ok
- 信息无误点击 next
点击Finish就会在你的app目录下创建出对应的jks文件
4.修改配置文件的一些地方
(其实在网页版的华为开发者联盟中会出现教程,这边建议跟着我的方式配置,手敲就行,根据图片中文字教程来) (请严格按照顺序来做)
!修改该配置放在第一步的原因是因为,需要先帮gradle配置好maven,后面的配置才可以依赖该maven导入对应的包,不然就会报错。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
mavenCentral()
maven { url 'https://developer.huawei.com/repo/' }
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.2"
classpath 'com.huawei.agconnect:agcp:1.5.2.300'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
至此所有的配置修改完毕,请不要再更改任何配置
5.MainActivity的编写以及介绍华为的用户授权流程
首先我们要了解帐号登录是基于OAuth 2.0协议标准和OpenID Connect协议,它支持的授权登录方式有两种,Authorization Code和ID Token,也就是说应用可以通过获取帐号用户身份认证信息(ID Token)或用户的临时授权票据(Authorization Code),使用户安全登录。
这里也不说太深奥,具体就是我们登入成功之后服务器会返沪一个ID TOKEN,ID Token是已经登录用户的身份信息,其中包括用来验证身份信息的签名信息。ID Token模式就是用户身份认证信息的模式,这种模式同时适合单机应用和有自己服务器的应用,可以在这个Token中取得信息。ID Token模式是应用程序直接拿到用户的ID Token信息,使用应用时应用本地通过校验ID Token的有效性来完成鉴权。综上所述,当App只有客户端时,我们可以通过ID Token模式实现用户授权。
言归正传进入代码部分(后面会放全部源码)
至此代码部分讲解到此结束 附上源码
package com.huawei.hmsmyapplicationdemo2;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.huawei.hmf.tasks.OnFailureListener;
import com.huawei.hmf.tasks.OnSuccessListener;
import com.huawei.hmf.tasks.Task;
import com.huawei.hms.common.ApiException;
import com.huawei.hms.support.account.AccountAuthManager;
import com.huawei.hms.support.account.request.AccountAuthParams;
import com.huawei.hms.support.account.request.AccountAuthParamsHelper;
import com.huawei.hms.support.account.result.AuthAccount;
import com.huawei.hms.support.account.service.AccountAuthService;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
// 创建静态常量TAG代表本类名,主要作用是用来做日志处理查询
private static final String TAG= "MainActivity";
private AccountAuthParams authParams;//
private AccountAuthService service;
private Button bt_ID_token;
private Button account_Signout;
private Button cancel_authorization;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_ID_token = findViewById(R.id.bt_id_token);
account_Signout = findViewById(R.id.account_siqnout);
cancel_authorization = findViewById(R.id.cancel);
bt_ID_token.setOnClickListener(this);
account_Signout.setOnClickListener(this);
cancel_authorization.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// 创建HuaweiIdAuthParams对象,该对象就是利用AccountAuthParamsHelper构造一个AccountAuthParams对象,
// 用该对象设置ID TOKEN模式
authParams=new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM)
.setIdToken() //设置使用ID Token模式(必写)
.setAccessToken()//设置成功Token模式 (选写)
.createParams(); //创建这个params (必写)
/**HuaweiIdAuthService使用HuaweiIdAuthParams对象作为参数,它定义了静默授权、退出、取消授权等方法,
其中getSignInIntent方法返回了一个intent对象。
Intent对象是activity传递信息的媒介,它包含了启动授权activity的intent信息,
客户端的后续操作都需要通过这个对象的API来完成,比如拉起授权页面、登出华为账号等功能。
**/
service = AccountAuthManager.getService(MainActivity.this,authParams);
switch (v.getId()){
//利用switch来判断点击的是 登入、取消、退出 按钮
case R.id.bt_id_token:
// 获取登入授权页面的Intent,并通过startActivityDorResult拉起授权页面(该方法就是拉起华为登入页面的方法)
startActivityForResult(service.getSignInIntent(),8888);
break;
case R.id.account_siqnout:
//点击了退出按钮就进行了退出 调用方法 signout();
Task<Void> signOutTask = service.signOut();
signOutTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// //这边监听退出成功事件 成功退出之后打印消息
Log.i(TAG,"退出当前用户成功");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.i(TAG,"退出当前用户失败");
}
});
break;
case R.id.cancel:
Task<Void> task = service.cancelAuthorization();
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.i(TAG,"取消成功");
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.i(TAG,"取消失败");
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.i(TAG,"取消失败"+e.getClass().getSimpleName());
}
});
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 8888){
Task<AuthAccount> authAccountTask = AccountAuthManager.parseAuthResultFromIntent(data);
if(authAccountTask.isSuccessful()){
//登录成功,获取用户的帐号信息和ID Token
AuthAccount authAccount = authAccountTask.getResult();
Log.i(TAG,"idToken:"+authAccount.getIdToken());
Log.i(TAG,"DisplayName:"+authAccount.getDisplayName());
Log.i(TAG,"AvatarUriString:"+authAccount.getAvatarUriString());
}else {
// 华为账号登入失败
Log.e(TAG,"登入失败:"+((ApiException)authAccountTask.getException()).getStatusCode());
}
}
}
}
6.这一步需要登入到我们华为开发者联盟中操作(具体看图讲解)
至此浏览器操作结束。
6.测试
首先要先下一个逍遥模拟器,然后将机型改为华为,如果有华为的手机的可以用自己手机,然后再逍遥模拟器中下载一个hms.apk并且安装。
然后我们打开逍遥模拟器,安卓就会自动的匹配模拟器端。
运行之后
点击登入成功拉起登入页面
最后看看日志
最后告诫配置地方那个一定要好好看,注意点都有注释。
如果有疑问可以联系我qq 332808083。