HarmonyOS 第三方登录之QQ登录
应用开发 2025-10-06 18:02:44
0
想了解更多内容,第登录请访问:
和华为官方合作共建的第登录鸿蒙技术社区
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();// 唯一标识,站群服务器成功授权后回调时会原样带回。 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=