您现在的位置是:亿华云 > 系统运维

HarmonyOS 第三方登录之QQ登录

亿华云2025-10-05 07:31:40【系统运维】6人已围观

简介想了解更多内容,请访问:和华为官方合作共建的鸿蒙技术社区https://harmonyos.51cto.com前言因为鸿蒙系统刚出不久,官方的第三方登录SDK还没出来,下面就介绍下在鸿蒙应用中实现QQ

想了解更多内容,第登录请访问:

和华为官方合作共建的第登录鸿蒙技术社区

https://harmonyos.51cto.com

前言

因为鸿蒙系统刚出不久,官方的第登录第三方登录SDK还没出来,下面就介绍下在鸿蒙应用中实现QQ登录的第登录方法(支持唤起QQ安卓客户端进行授权)

前期准备

登录QQ开放平台 > 应用管理 > 创建应用 ,创建一个网站应用。第登录

注意:要选择网站应用,第登录移动应用和小程序不适用该方案。第登录

编写代码

判断是第登录否已登录

获取登录状态

在入口AbilitySliceMainAbilitySlice中进行判断。

从数据库获取token的第登录值判断是网站模板否已经登录账号 (已登录返回token,未登录返回null)

// 创建数据库(这里使用官方提供的第登录“轻量级数据存储”,相关文档:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-preference-guidelines-0000000000030083) Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME"); //  从数据库获取token的第登录值判断是否已经登录账号 (已登录返回token,未登录返回null) String token = preferences.getString("token",第登录null); 

进行相应跳转

已登录跳转至个人界面MyAbility,未登录跳转至登录界面LoginAbility.

if(token != null){              // 已登录,第登录跳转至MyAbility             Intent myIntent = new Intent();             myIntent.setParam("token",第登录 token);             Operation myOperation = new Intent.OperationBuilder()                     .withBundleName("cn.dsttl3.test")                     .withAbilityName("cn.dsttl3.qqlogin.MyAbility")                     .build();             myIntent.setOperation(myOperation);             startAbility(myIntent);             terminateAbility(); }else {              // 未登录,跳转至LoginAbility             Intent loginIntent = new Intent();             Operation loginOperation = new Intent.OperationBuilder()                     .withBundleName("cn.dsttl3.test")                     .withAbilityName("cn.dsttl3.qqlogin.LoginAbility")                     .build();             loginIntent.setOperation(loginOperation);             startAbility(loginIntent);             terminateAbility(); } 

登录界面的第登录操作

申请网络访问权限

在config.json添加

"reqPermissions": [       {          "name": "ohos.permission.INTERNET"       }     ] 

登录界面布局文件ability_login.xml

在布局文件中添加以后webview组件

<?xml version="1.0" encoding="utf-8"?> <DirectionalLayout     xmlns:ohos="http://schemas.huawei.com/res/ohos"     ohos:height="match_parent"     ohos:width="match_parent"     ohos:alignment="center"     ohos:orientation="vertical">      <ohos.agp.components.webengine.WebView         ohos:id="$+id:WebView_qqlogin"         ohos:height="match_parent"         ohos:width="match_parent"/>  </DirectionalLayout> 

登录界面的AbilitySlice LoginAbilitySlice.java

需要用到的几个常量

String state = UUID.randomUUID().toString();// 唯一标识,云南idc服务商成功授权后回调时会原样带回。 String client_id = "101***151";//QQ开放平台 应用 APP ID String redirect_uri = "https%3A%2F%2Fapi.dsttl3.cn%2FRedis%2FQQLogin"; //应用 网站回调域 需进行url编码,授权成功后会跳转至该链接 String authorize_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code" +             "&client_id=" + client_id +             "&redirect_uri=" + redirect_uri +             "&state="+ state; 

 WebView的配置

WebView myWebView = (WebView) findComponentById(ResourceTable.Id_WebView_qqlogin);         myWebView.getWebConfig().setJavaScriptPermit(true);//支持JavaScript         myWebView.getWebConfig().setUserAgent("android");//将UserAgent设置为安卓,授权页才显示QQ客户端一键登录按钮 

自定义WebAgent

当WebView即将打开一个链接时调用isNeedLoadUrl方法,当在网页上点击“一键登录”时,打开QQ客户端

wtloginmqq是QQ安卓客户端URL Scheme

if (request.getRequestUrl().toString().startsWith("wtloginmqq")){                     // 打开QQ客户端                    Intent qqIntent = new Intent();                    Operation qqOperation = new Intent.OperationBuilder()                            .withAction("android.intent.action.VIEW")                            .withUri(Uri.parse(request.getRequestUrl().toString()))                            .build();                    qqIntent.setOperation(qqOperation);                    startAbility(qqIntent); 

因为目前还找不到网页端唤起鸿蒙应用的方法,所以QQ客户端回调的code放在自己服务器处理。

授权成功后,会打开之前在QQ开放平台设置的高防服务器回调域redirect_uri

示例:https://api.dsttl3.cn/Redis/QQLogin?code=

很赞哦!(2)