首页 / 行业
鸿蒙应用如何唤起 QQ 安卓客户端进行授权
2022-01-04 15:01:00
因为鸿蒙系统刚出不久,官方的第三方登录 SDK 还没出来,下面就介绍下在鸿蒙应用中实现 QQ 登录的方法(支持唤起 QQ 安卓客户端进行授权)。
前期准备
登录 QQ 开放平台→应用管理→创建应用 ,创建一个网站应用。
https://connect.qq.com/index.html注意:要选择网站应用,移动应用和小程序不适用该方案。
编写代码
①判断是否已登录
获取登录状态:在入口 AbilitySliceMainAbilitySlice 中进行判断。
从数据库获取 token 的值判断是否已经登录账号(已登录返回 token,未登录返回 null)
//创建数据库(这里使用官方提供的“轻量级数据存储”,相关文档:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-preference-guidelines-0000000000030083)Preferencespreferences=newDatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");//从数据库获取token的值判断是否已经登录账号(已登录返回token,未登录返回null)Stringtoken=preferences.getString("token",null);
进行相应跳转:已登录跳转至个人界面 MyAbility,未登录跳转至登录界面 LoginAbility。
if(token!=null){//已登录,跳转至MyAbilityIntentmyIntent=newIntent();myIntent.setParam("token",token);OperationmyOperation=newIntent.OperationBuilder().withBundleName("cn.dsttl3.test").withAbilityName("cn.dsttl3.qqlogin.MyAbility").build();myIntent.setOperation(myOperation);startAbility(myIntent);terminateAbility();}else{//未登录,跳转至LoginAbilityIntentloginIntent=newIntent();OperationloginOperation=newIntent.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"?>
登录界面的 AbilitySlice LoginAbilitySlice.java,需要用到的几个常量如下:
Stringstate=UUID.randomUUID().toString();//唯一标识,成功授权后回调时会原样带回。Stringclient_id="101***151";//QQ开放平台应用APPIDStringredirect_uri="https%3A%2F%2Fapi.dsttl3.cn%2FRedis%2FQQLogin";//应用网站回调域需进行url编码,授权成功后会跳转至该链接Stringauthorize_url="https://graph.qq.com/oauth2.0/authorize?response_type=code"+"&client_id="+client_id+"&redirect_uri="+redirect_uri+"&state="+state;
WebView 的配置:
WebViewmyWebView=(WebView)findComponentById(ResourceTable.Id_WebView_qqlogin);myWebView.getWebConfig().setJavaScriptPermit(true);//支持JavaScriptmyWebView.getWebConfig().setUserAgent("android");//将UserAgent设置为安卓,授权页才显示QQ客户端一键登录按钮
自定义 WebAgent,当 WebView 即将打开一个链接时调用 isNeedLoadUrl 方法,当在网页上点击“一键登录”时,打开 QQ 客户端。
wtloginmqq 是 QQ 安卓客户端 URL Scheme:
if(request.getRequestUrl().toString().startsWith("wtloginmqq")){//打开QQ客户端IntentqqIntent=newIntent();OperationqqOperation=newIntent.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=********&state=*****
code:QQ 授权返回的 code,用于申请 token。
state:在 webview 请求 QQ 授权页面时传入的唯一标识,用于判断用户身份,方便后续从服务器请求 token。
出于安全考虑 ,请求 token 操作放在服务器上执行。获取到 token 后将 token 存入数据库,客户端通过请求 https://api.dsttl3.cn/Redis/Get?key= + state 来获取到 token。
客户端请求到 token 后,将 token 存储到数据库:
//将token存入数据库Preferencespreferences=newDatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");preferences.putString("token",token);preferences.flush();
token 存储完成后跳转至 MyAbility,自定义 WebAgent 完整代码:
myWebView.setWebAgent(newWebAgent(){//当WebView即将打开一个链接时调用该方法@OverridepublicbooleanisNeedLoadUrl(WebViewwebView,ResourceRequestrequest){//request.getRequestUrl().toString()WebView即将打开的链接地址if(request.getRequestUrl().toString().startsWith("wtloginmqq")){//打开QQ客户端IntentqqIntent=newIntent();OperationqqOperation=newIntent.OperationBuilder().withAction("android.intent.action.VIEW").withUri(Uri.parse(request.getRequestUrl().toString())).build();qqIntent.setOperation(qqOperation);startAbility(qqIntent);//向自己的服务器请求tokennewThread(newRunnable(){@Overridepublicvoidrun(){while(true){StringgetTokenURL="https://api.dsttl3.cn/Redis/Get?key="+state;try{OkHttpClientclient=newOkHttpClient();Requestrequest=newRequest.Builder().url(getTokenURL).build();Stringtoken=client.newCall(request).execute().body().string();if(token.length()==32){getUITaskDispatcher().asyncDispatch(newRunnable(){@Overridepublicvoidrun(){//将token存入数据库Preferencespreferences=newDatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");preferences.putString("token",token);preferences.flush();//跳转至用户界面IntentmyIntent=newIntent();OperationmyOperation=newIntent.OperationBuilder().withBundleName("cn.dsttl3.test").withAbilityName("cn.dsttl3.qqlogin.MyAbility").build();myIntent.setOperation(myOperation);startAbility(myIntent);terminateAbility();}});break;}Time.sleep(1500);}catch(IOExceptione){e.printStackTrace();}}}}).start();returnfalse;}returntrue;}});
加载网页:
myWebView.load(authorize_url);
LoginAbilitySlice.java 完整代码:
importcn.dsttl3.qqlogin.ResourceTable;importohos.aafwk.ability.AbilitySlice;importohos.aafwk.content.Intent;importohos.aafwk.content.Operation;importohos.agp.components.webengine.ResourceRequest;importohos.agp.components.webengine.WebAgent;importohos.agp.components.webengine.WebView;importohos.data.DatabaseHelper;importohos.data.preferences.Preferences;importohos.miscservices.timeutility.Time;importohos.utils.net.Uri;importokhttp3.OkHttpClient;importokhttp3.Request;importjava.io.IOException;importjava.util.UUID;publicclassLoginAbilitySliceextendsAbilitySlice{//QQ开放平台登录授权文档https://wiki.connect.qq.com/%e5%87%86%e5%a4%87%e5%b7%a5%e4%bd%9c_oauth2-0Stringstate=UUID.randomUUID().toString();//唯一标识,成功授权后回调时会原样带回。Stringclient_id="101547151";//QQ开放平台应用APPIDStringredirect_uri="https%3A%2F%2Fapi.dsttl3.cn%2FRedis%2FQQLogin";//应用网站回调域需进行url编码,授权成功后会跳转至该链接Stringauthorize_url="https://graph.qq.com/oauth2.0/authorize?response_type=code"+"&client_id="+client_id+"&redirect_uri="+redirect_uri+"&state="+state;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_login);WebViewmyWebView=(WebView)findComponentById(ResourceTable.Id_WebView_qqlogin);myWebView.getWebConfig().setJavaScriptPermit(true);myWebView.getWebConfig().setUserAgent("android");myWebView.setWebAgent(newWebAgent(){//当WebView即将打开一个链接时调用该方法@OverridepublicbooleanisNeedLoadUrl(WebViewwebView,ResourceRequestrequest){//request.getRequestUrl().toString()WebView即将打开的链接地址if(request.getRequestUrl().toString().startsWith("wtloginmqq")){//打开QQ客户端IntentqqIntent=newIntent();OperationqqOperation=newIntent.OperationBuilder().withAction("android.intent.action.VIEW").withUri(Uri.parse(request.getRequestUrl().toString())).build();qqIntent.setOperation(qqOperation);startAbility(qqIntent);//向自己的服务器请求tokennewThread(newRunnable(){@Overridepublicvoidrun(){while(true){StringgetTokenURL="https://api.dsttl3.cn/Redis/Get?key="+state;try{OkHttpClientclient=newOkHttpClient();Requestrequest=newRequest.Builder().url(getTokenURL).build();Stringtoken=client.newCall(request).execute().body().string();if(token.length()==32){getUITaskDispatcher().asyncDispatch(newRunnable(){@Overridepublicvoidrun(){//将token存入数据库Preferencespreferences=newDatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");preferences.putString("token",token);preferences.flush();//跳转至用户界面IntentmyIntent=newIntent();OperationmyOperation=newIntent.OperationBuilder().withBundleName("cn.dsttl3.test").withAbilityName("cn.dsttl3.qqlogin.MyAbility").build();myIntent.setOperation(myOperation);startAbility(myIntent);terminateAbility();}});break;}Time.sleep(1500);}catch(IOExceptione){e.printStackTrace();}}}}).start();returnfalse;}returntrue;}});myWebView.load(authorize_url);}}
个人界面,获取 token 信息:
Preferencespreferences=newDatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");Stringtoken=preferences.getString("token",null);
更新 Text 数据:
Texttext=findComponentById(ResourceTable.Id_text_helloworld);text.setText(token);
后续操作
获取用户信息请参考 QQ 开放平台文档:
https://wiki.connect.qq.com/get_user_info
附件下载:
https://harmonyos.51cto.com/posts/9448
原文标题:在鸿蒙上实现QQ第三方登录!
文章出处:【微信公众号:HarmonyOS技术社区】欢迎添加关注!文章转载请注明出处。
审核编辑:彭菁最新内容
手机 |
相关内容
半导体主控技术:驱动自动驾驶革命的
半导体主控技术:驱动自动驾驶革命的引擎,自动驾驶,交通,自动驾驶系统,数据,车辆,自动,随着科技的不断进步,自动驾驶技术已经成为现实晶振在激光雷达系统中的作用
晶振在激光雷达系统中的作用,作用,系统,激光雷达,晶振,可靠性,选择,激光雷达(Lidar)是一种利用激光进行测距的技术,广泛应用于自动驾驶Arbe 4D成像雷达以高分辨率雷达技
Arbe 4D成像雷达以高分辨率雷达技术和先进处理技术消除“幽灵刹车”问题,刹车,成像,分辨率,系统,目标,数据,Arbe 4D成像雷达是一种浅析动力电池熔断器的基础知识及选
浅析动力电池熔断器的基础知识及选型,动力电池,时切,系统安全,作用,产品,系统,BA4558F-E2动力电池熔断器是用于保护动力电池系统安智能家居中的MEMS传感器
智能家居中的MEMS传感器,传感器,智能家居,控制,用户,温度传感器,系统,MEMS(微机电系统)传感器是智能家居中的关键技术之一。它们是一英飞凌推出XENSIV胎压传感器,满足智
英飞凌推出XENSIV胎压传感器,满足智能胎压监测系统的需求,智能,胎压传感器,推出,胎压监测系统,英飞凌,需求,英飞凌(Infineon)是一家全英伟达系列芯片设计的高阶自动驾驶
英伟达系列芯片设计的高阶自动驾驶系统启动时序流程,启动,自动驾驶系统,芯片,英伟达,控制,车辆,英伟达(NVIDIA)是一家全球领先的人工MPS全系列电机驱动产品,助力新能源
MPS全系列电机驱动产品,助力新能源汽车实现更好的智能化,产品,新能源汽车,助力,全系列,系统,实时,随着新能源汽车的快速发展,电机驱动