更多内容请访问:Harmonyos技术社区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)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();}登录界面的操作申请网络访问权限,添加“reqPermissions”在config.json:[{"name":"ohos.permission.INTERNET"}]在布局文件中添加登录界面布局文件ability_login.xml后,webview组件登录界面的AbilitySliceLoginAbilitySlice.java需要用到几个常量Stringstate=UUID.randomUUID().toString();//唯一标识,授权成功后回调时原样带回来Stringclient_id="101***151";//QQ开放平台应用APPIDStringredirect_uri="https%3A%2F%2Fapi.dsttl3.cn%2FRedis%2FQQLogin";//应用网站回调域需要url编码,授权成功后会跳转到这个链接"+state;WebViewConfigurationWebViewmyWebView=(WebView)findComponentById(ResourceTable.Id_WebView_qqlogin);myWebView.getWebConfig().setJavaScriptPermit(true);//支持JavaScriptmyWebView.getWebConfig().setUserAgent("android");//设置UserAgent到Android,授权页面显示QQ客户端一键登录按钮。自定义WebAgent。当WebView即将打开链接时,调用isNeedLoadUrl方法。在网页点击“一键登录”时,打开QQ客户端wtloginmqq为QQ安卓客户端URLSchemeif(request.getRequestUrl().toString().startsWith("wtloginmqq")){//打开QQ客户端IntentqqIntent=newIntent();Operationqq??Operation=newIntent.OperationBuilder().withAction("android.intent.action.VIEW").withUri(Uri.parse(request.getRequestUrl().toString())).build();qqIntent.setOperation(qqOperation);startAbility(qqIntent);因为网页上还是没有办法调用鸿蒙应用,所以放置QQ客户端回调代码在自己的服务器处理授权成功后,会打开之前在QQ开放平台设置的回调域redirect_uri例子:https://api.dsttl3.cn/Redis/QQLogin?code=**********&state=*****code:QQ授权返回的code,用于申请tokenstate:webview请求QQ授权页面时传入的唯一标识,用于判断用户身份,方便后续请求来自服务器的令牌。出于安全原因,请求令牌操作放在服务器上执行。获取token后,将token存入数据库,客户端通过请求https://api.dsttl3.cn/Redis/Get?key=+state获取token,客户端请求token后,将token存入database//将token存入数据库token存储完成后跳转到MyAbilityCustomWebAgent代码myWebView.setWebAgent(newWebAgent(){//WebView即将打开一个链接时调用该方法@OverridepublicbooleanisNeedLoadUrl(WebViewwebView,ResourceRequestrequest){//request.getRequestUrl().toString()WebView即将打开链接地址if(request.getRequestUrl().toString().startsWith("wtloginmqq")){//打开QQ客户端IntentqqIntent=newIntent();Operationqq??Operation=newIntent.OperationBuilder().withAction("android.intent.action.VIEW").withUri(Uri.parse(request.getRequestUrl().toString())).build();qqIntent.setOperation(qqOperation);startAbility(qqIntent);//请求token你自己的服务器newThread(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;}时间.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;导入java.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();Operationqq??Operation=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(){//将令牌存入数据库Preferencespreferences=newDatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");preferences.putString("token",token);preferences.flush();//跳转到用户界面IntentmyIntent=newIntent();OperationmyOperation=newIntent.OperationBuilder().withBundleName("cn.dsttl3.test").与阿比lityName("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);更新文本数据Texttext=findComponentById(ResourceTable.Id_text_helloworld);text.setText(token);后续操作获取用户信息请参考QQ开放平台文档https://wiki.connect.qq.com/get_user_info文章相关附件可点击下方链接下载原文https://harmonyos.51cto.com/resource/1554更多信息请访问:与华为官方Harmonyos共同打造的技术社区https://harmonyos.51cto.com