国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - HarmonyOS 第三方登錄之QQ登錄

HarmonyOS 第三方登錄之QQ登錄

2021-12-06 23:41鴻蒙社區dsttl3點cn 編程技術

因為鴻蒙系統剛出不久,官方的第三方登錄SDK還沒出來,下面就介紹下在鴻蒙應用中實現QQ登錄的方法(支持喚起QQ安卓客戶端進行授權)

HarmonyOS 第三方登錄之QQ登錄

前言

因為鴻蒙系統剛出不久,官方的第三方登錄SDK還沒出來,下面就介紹下在鴻蒙應用中實現QQ登錄的方法(支持喚起QQ安卓客戶端進行授權)

前期準備

登錄QQ開放平臺 > 應用管理 > 創建應用 ,創建一個網站應用。

注意:要選擇網站應用,移動應用和小程序不適用該方案。

編寫代碼

判斷是否已登錄

獲取登錄狀態

在入口AbilitySliceMainAbilitySlice中進行判斷。

從數據庫獲取token的值判斷是否已經登錄賬號 (已登錄返回token,未登錄返回null)

  1. // 創建數據庫(這里使用官方提供的“輕量級數據存儲”,相關文檔:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-preference-guidelines-0000000000030083)
  2. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  3. // 從數據庫獲取token的值判斷是否已經登錄賬號 (已登錄返回token,未登錄返回null)
  4. String token = preferences.getString("token",null);

進行相應跳轉

已登錄跳轉至個人界面MyAbility,未登錄跳轉至登錄界面LoginAbility.

  1. if(token != null){
  2. // 已登錄,跳轉至MyAbility
  3. Intent myIntent = new Intent();
  4. myIntent.setParam("token", token);
  5. Operation myOperation = new Intent.OperationBuilder()
  6. .withBundleName("cn.dsttl3.test")
  7. .withAbilityName("cn.dsttl3.qqlogin.MyAbility")
  8. .build();
  9. myIntent.setOperation(myOperation);
  10. startAbility(myIntent);
  11. terminateAbility();
  12. }else {
  13. // 未登錄,跳轉至LoginAbility
  14. Intent loginIntent = new Intent();
  15. Operation loginOperation = new Intent.OperationBuilder()
  16. .withBundleName("cn.dsttl3.test")
  17. .withAbilityName("cn.dsttl3.qqlogin.LoginAbility")
  18. .build();
  19. loginIntent.setOperation(loginOperation);
  20. startAbility(loginIntent);
  21. terminateAbility();
  22. }

登錄界面的操作

申請網絡訪問權限

在config.json添加

  1. "reqPermissions": [
  2. {
  3. "name": "ohos.permission.INTERNET"
  4. }
  5. ]

登錄界面布局文件ability_login.xml

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

  1. "1.0" encoding="utf-8"?>
  2. xmlns:ohos="http://schemas.huawei.com/res/ohos"
  3. ohos:height="match_parent"
  4. ohos:width="match_parent"
  5. ohos:alignment="center"
  6. ohos:orientation="vertical">
  7. ohos:id="$+id:WebView_qqlogin"
  8. ohos:height="match_parent"
  9. ohos:width="match_parent"/>

登錄界面的AbilitySlice LoginAbilitySlice.java

需要用到的幾個常量

  1. String state = UUID.randomUUID().toString();// 唯一標識,成功授權后回調時會原樣帶回。
  2. String client_id = "101***151";//QQ開放平臺 應用 APP ID
  3. String redirect_uri = "https%3A%2F%2Fapi.dsttl3.cn%2FRedis%2FQQLogin"; //應用 網站回調域 需進行url編碼,授權成功后會跳轉至該鏈接
  4. String authorize_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code" +
  5. "&client_id=" + client_id +
  6. "&redirect_uri=" + redirect_uri +
  7. "&state="+ state;

WebView的配置

  1. WebView myWebView = (WebView) findComponentById(ResourceTable.Id_WebView_qqlogin);
  2. myWebView.getWebConfig().setJavaScriptPermit(true);//支持JavaScript
  3. myWebView.getWebConfig().setUserAgent("android");//將UserAgent設置為安卓,授權頁才顯示QQ客戶端一鍵登錄按鈕

自定義WebAgent

當WebView即將打開一個鏈接時調用isNeedLoadUrl方法,當在網頁上點擊“一鍵登錄”時,打開QQ客戶端

wtloginmqq是QQ安卓客戶端URL Scheme

  1. if (request.getRequestUrl().toString().startsWith("wtloginmqq")){
  2. // 打開QQ客戶端
  3. Intent qqIntent = new Intent();
  4. Operation qqOperation = new Intent.OperationBuilder()
  5. .withAction("android.intent.action.VIEW")
  6. .withUri(Uri.parse(request.getRequestUrl().toString()))
  7. .build();
  8. qqIntent.setOperation(qqOperation);
  9. 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存儲到數據庫

  1. // 將token存入數據庫
  2. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  3. preferences.putString("token",token);
  4. preferences.flush();

token存儲完成后跳轉至MyAbility

自定義WebAgent完整代碼

  1. myWebView.setWebAgent(new WebAgent(){
  2. // 當WebView即將打開一個鏈接時調用該方法
  3. @Override
  4. public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) {
  5. // request.getRequestUrl().toString() WebView即將打開的鏈接地址
  6. if (request.getRequestUrl().toString().startsWith("wtloginmqq")){
  7. // 打開QQ客戶端
  8. Intent qqIntent = new Intent();
  9. Operation qqOperation = new Intent.OperationBuilder()
  10. .withAction("android.intent.action.VIEW")
  11. .withUri(Uri.parse(request.getRequestUrl().toString()))
  12. .build();
  13. qqIntent.setOperation(qqOperation);
  14. startAbility(qqIntent);
  15. // 向自己的服務器請求token
  16. new Thread(new Runnable() {
  17. @Override
  18. public void run() {
  19. while (true){
  20. String getTokenURL = "https://api.dsttl3.cn/Redis/Get?key=" + state;
  21. try {
  22. OkHttpClient client = new OkHttpClient();
  23. Request request = new Request.Builder().url(getTokenURL).build();
  24. String token = client.newCall(request).execute().body().string();
  25. if (token.length() == 32){
  26. getUITaskDispatcher().asyncDispatch(new Runnable() {
  27. @Override
  28. public void run() {
  29. // 將token存入數據庫
  30. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  31. preferences.putString("token",token);
  32. preferences.flush();
  33. // 跳轉至用戶界面
  34. Intent myIntent = new Intent();
  35. Operation myOperation = new Intent.OperationBuilder()
  36. .withBundleName("cn.dsttl3.test")
  37. .withAbilityName("cn.dsttl3.qqlogin.MyAbility")
  38. .build();
  39. myIntent.setOperation(myOperation);
  40. startAbility(myIntent);
  41. terminateAbility();
  42. }
  43. });
  44. break;
  45. }
  46. Time.sleep(1500);
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. }).start();
  53. return false;
  54. }
  55. return true;
  56. }
  57. });

加載網頁

  1. myWebView.load(authorize_url);

LoginAbilitySlice.java完整代碼

  1. import cn.dsttl3.qqlogin.ResourceTable;
  2. import ohos.aafwk.ability.AbilitySlice;
  3. import ohos.aafwk.content.Intent;
  4. import ohos.aafwk.content.Operation;
  5. import ohos.agp.components.webengine.ResourceRequest;
  6. import ohos.agp.components.webengine.WebAgent;
  7. import ohos.agp.components.webengine.WebView;
  8. import ohos.data.DatabaseHelper;
  9. import ohos.data.preferences.Preferences;
  10. import ohos.miscservices.timeutility.Time;
  11. import ohos.utils.net.Uri;
  12. import okhttp3.OkHttpClient;
  13. import okhttp3.Request;
  14. import java.io.IOException;
  15. import java.util.UUID;
  16. public class LoginAbilitySlice extends AbilitySlice {
  17. //QQ開放平臺登錄授權文檔 https://wiki.connect.qq.com/%e5%87%86%e5%a4%87%e5%b7%a5%e4%bd%9c_oauth2-0
  18. String state = UUID.randomUUID().toString();// 唯一標識,成功授權后回調時會原樣帶回。
  19. String client_id = "101547151";//QQ開放平臺 應用 APP ID
  20. String redirect_uri = "https%3A%2F%2Fapi.dsttl3.cn%2FRedis%2FQQLogin"; //應用 網站回調域 需進行url編碼,授權成功后會跳轉至該鏈接
  21. String authorize_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code" +
  22. "&client_id=" + client_id +
  23. "&redirect_uri=" + redirect_uri +
  24. "&state="+ state;
  25. @Override
  26. public void onStart(Intent intent) {
  27. super.onStart(intent);
  28. super.setUIContent(ResourceTable.Layout_ability_login);
  29. WebView myWebView = (WebView) findComponentById(ResourceTable.Id_WebView_qqlogin);
  30. myWebView.getWebConfig().setJavaScriptPermit(true);
  31. myWebView.getWebConfig().setUserAgent("android");
  32. myWebView.setWebAgent(new WebAgent(){
  33. // 當WebView即將打開一個鏈接時調用該方法
  34. @Override
  35. public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) {
  36. // request.getRequestUrl().toString() WebView即將打開的鏈接地址
  37. if (request.getRequestUrl().toString().startsWith("wtloginmqq")){
  38. // 打開QQ客戶端
  39. Intent qqIntent = new Intent();
  40. Operation qqOperation = new Intent.OperationBuilder()
  41. .withAction("android.intent.action.VIEW")
  42. .withUri(Uri.parse(request.getRequestUrl().toString()))
  43. .build();
  44. qqIntent.setOperation(qqOperation);
  45. startAbility(qqIntent);
  46. // 向自己的服務器請求token
  47. new Thread(new Runnable() {
  48. @Override
  49. public void run() {
  50. while (true){
  51. String getTokenURL = "https://api.dsttl3.cn/Redis/Get?key=" + state;
  52. try {
  53. OkHttpClient client = new OkHttpClient();
  54. Request request = new Request.Builder().url(getTokenURL).build();
  55. String token = client.newCall(request).execute().body().string();
  56. if (token.length() == 32){
  57. getUITaskDispatcher().asyncDispatch(new Runnable() {
  58. @Override
  59. public void run() {
  60. // 將token存入數據庫
  61. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  62. preferences.putString("token",token);
  63. preferences.flush();
  64. // 跳轉至用戶界面
  65. Intent myIntent = new Intent();
  66. Operation myOperation = new Intent.OperationBuilder()
  67. .withBundleName("cn.dsttl3.test")
  68. .withAbilityName("cn.dsttl3.qqlogin.MyAbility")
  69. .build();
  70. myIntent.setOperation(myOperation);
  71. startAbility(myIntent);
  72. terminateAbility();
  73. }
  74. });
  75. break;
  76. }
  77. Time.sleep(1500);
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. }
  83. }).start();
  84. return false;
  85. }
  86. return true;
  87. }
  88. });
  89. myWebView.load(authorize_url);
  90. }
  91. }

個人界面

獲取token信息

  1. Preferences preferences = new DatabaseHelper(getApplicationContext()).getPreferences("DATA_NAME");
  2. String token = preferences.getString("token",null);

更新Text數據

  1. Text text = findComponentById(ResourceTable.Id_text_helloworld);
  2. text.setText(token);

后續操作

獲取用戶信息請參考QQ開放平臺文檔 https://wiki.connect.qq.com/get_user_info

文章相關附件可以點擊下面的原文鏈接前往下載

https://harmonyos.51cto.com/resource/1554

原文鏈接:https://harmonyos.51cto.com

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 激情五月婷婷综合 | 91午夜理伦私人影院 | 亚洲视频自拍 | 亚洲精品一级 | 在线一区二区三区四区 | 国产综合久久久 | 国产九九九 | 精品久久久久久久久久 | 91久久在线 | 日韩av在线电影 | 欧美精品1区2区 | 午夜爽 | 欧美日韩国产在线播放 | 久久大伊人 | 日韩国产在线观看 | 欧美在线播放一区 | 三级视频在线观看 | 精品国产乱码久久久久久牛牛 | 日韩国产 | 国产成人高清 | 亚洲国产成人久久 | 激情视频网站 | 免费视频一区二区 | 成人亚洲欧美 | 在线观看日韩av | 99久久精品国产一区二区三区 | av一区在线观看 | 狠狠色狠狠色合久久伊人 | 99re热精品视频 | www.久久精品 | 亚洲成年人网站在线观看 | 一级黄色毛片 | 国产一区二区三区在线视频 | 久久视频热 | 亚洲国内精品 | 精品国产一区二区三区性色av | 国产99在线| 成人影视免费 | 99久久视频| 国产一区在线视频播放 | 日韩欧美在线综合网 |