国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

HarmonyOS 第三方登錄之QQ登錄

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

[[438480]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

前言

因為鴻蒙系統剛出不久,官方的第三方登錄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(); 

登錄界面的操作

申請網絡訪問權限

在config.json添加

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

登錄界面布局文件ability_login.xml

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

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:height="match_parent" 
  5.     ohos:width="match_parent" 
  6.     ohos:alignment="center" 
  7.     ohos:orientation="vertical"
  8.  
  9.     <ohos.agp.components.webengine.WebView 
  10.         ohos:id="$+id:WebView_qqlogin" 
  11.         ohos:height="match_parent" 
  12.         ohos:width="match_parent"/> 
  13.  
  14. </DirectionalLayout> 

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

個人界面

獲取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

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2015-11-05 16:44:37

第三方登陸android源碼

2015-01-20 17:01:30

Android源碼QQdemo

2014-07-23 08:55:42

iOSFMDB

2025-06-26 08:15:00

JustAuth

2025-02-05 10:19:24

2024-03-04 10:36:39

2011-12-20 14:23:15

MozillaBrower ID

2021-03-03 09:42:26

鴻蒙HarmonyOS圖片裁剪

2019-07-30 11:35:54

AndroidRetrofit

2021-08-26 16:07:46

鴻蒙HarmonyOS應用

2018-09-30 15:18:29

2021-08-03 10:07:41

鴻蒙HarmonyOS應用

2019-09-03 18:31:19

第三方支付電商支付行業

2021-03-01 14:00:11

鴻蒙HarmonyOS應用

2016-10-21 14:09:10

2009-12-31 14:38:34

Silverlight

2017-12-11 15:53:56

2021-03-10 15:03:40

鴻蒙HarmonyOS應用

2021-04-29 14:32:24

鴻蒙HarmonyOS應用

2010-05-25 11:09:31

SVN工具
點贊
收藏

51CTO技術棧公眾號

韩国欧美国产1区| 午夜久久福利影院| 国产精品成人观看视频免费| 少妇高潮一区二区三区99| 欧美精品aⅴ在线视频| 伊人影院在线播放| 亚洲欧美综合色| 91免费视频网站在线观看| 国产在线视频一区二区| 含羞草久久爱69一区| 久久福利影院| 欧美一二三视频| 国产精品久久久久久久久久辛辛 | wwwww在线观看免费视频| 亚洲高清中文字幕| 日本搞黄视频| 亚洲日本在线看| 免费羞羞视频网站| 亚洲精品美国一| 日本中文字幕电影| 香蕉乱码成人久久天堂爱免费| 男人的天堂网av| 亚洲影视在线播放| 亚洲kkk444kkk在线观看| 日韩欧美精品免费在线| 国产一区二区三区不卡在线| 欧美亚洲国产一区在线观看网站| 涩爱av在线播放一区二区| 欧美日韩中文字幕综合视频| 免费a级毛片在线观看| 欧美色综合久久| 超碰最新在线| 亚洲精品久久久久中文字幕二区| 亚洲优女在线| 日韩一区二区三区国产| jizz久久精品永久免费| 欧美一区二区三区精品电影| 久久电影院7| 九色91国产| 日本特黄久久久高潮| 在线精品日韩| 91网站在线播放| 欧美wwwwwww| 日韩欧美国产网站| 国内精品不卡| 亚洲精品有码在线| 亚洲一区二区三区日本久久九 | 精品久久亚洲| 日韩av不卡电影| 亚洲狼人精品一区二区三区| 国产系列第一页| 26uuu亚洲| h网址在线观看| 制服丝袜在线91| 日韩不卡视频在线观看| 97在线视频精品| 一区在线视频| 91嫩草国产丨精品入口麻豆| 亚洲欧洲成人自拍| 国产粉嫩一区二区三区在线观看 | 久久免费成人精品视频| 国产精品黑丝在线播放| 国产精品12| 国产精品一区二区视频| 色免费在线视频| 欧美日韩一级二级三级| 欧美成人精品三级网站| 日韩av男人的天堂| 老色鬼久久亚洲一区二区| 免费国产成人av| 日韩欧美999| 忘忧草在线www成人影院| 国产精品入口福利| 国产精品综合二区| 黄污在线观看| 亚洲欧美日韩精品久久亚洲区 | 久久精品国产亚洲7777| 亚洲精彩视频| av在线com| 午夜av区久久| 欧洲精品久久久久毛片完整版| 91精品视频专区| 高清久久久久久| 国产精品㊣新片速递bt| 亚洲日本欧美中文幕| 91欧美国产| 自慰无码一区二区三区| 午夜视频在线观看精品中文| 高清国语自产拍免费一区二区三区| av一二三不卡影片| 成人jjav| 欧美在线视频免费播放| 成熟亚洲日本毛茸茸凸凹| jyzzz在线观看视频| 91sa在线看| 丰满白嫩尤物一区二区| 高清毛片在线看| 国产精品av电影| 久久麻豆一区二区| 久草免费在线视频| 欧洲久久久久久| 一本色道久久综合狠狠躁的推荐| 97视频一区| 欧洲精品一区二区三区久久| 欧美久久一区二区三区| 久久免费看毛片| 欧美一级搡bbbb搡bbbb| 亚洲欧美综合| 一个人看的www一区| 久久久久久久久久久人体| 韩日av一区二区| 国产写真视频在线观看| 国产经品一区二区| 色哟哟一区二区在线观看 | 久久99久久99精品免观看粉嫩| 久久精品五月| 精品乱码一区二区三四区视频 | 亚洲欧美日韩久久| 日韩欧美久久| 缅甸午夜性猛交xxxx| 亚洲欧美日韩精品久久亚洲区| 久久精品一区| 欧美成人hd| 精品久久久久亚洲| 欧美吻胸吃奶大尺度电影| 国产电影一区二区在线观看| 宅男深夜视频| 国产一区玩具在线观看| 午夜免费久久看| 91精品国产91久久久久久密臀| 在线人体午夜视频| 国产精品自拍视频| 欧美性生交大片免网| 亚洲人metart人体| 欧美大片aaa| 国产精品一区二区三区免费| 欧美日韩精品一区视频| 国产毛片一区| 暖暖日本在线观看| 亚洲国产一区二区三区在线播| 亚洲а∨天堂久久精品9966| 丝袜亚洲另类欧美综合| 深夜在线视频| 日批视频在线免费看| 97香蕉久久超级碰碰高清版| 亚洲综合精品自拍| 欧美高清日韩| а天堂中文在线官网| 日韩不卡av| 亚洲欧美国内爽妇网| 99免费精品在线观看| 国产精品xxx在线观看| 美女网站在线| 免费日韩av电影| 国产亚洲一区精品| 中文字幕在线不卡一区二区三区 | 国产精品久久久久久久久借妻| 久久亚洲一区二区三区四区| 岛国精品一区| 午夜影院免费看| 国产欧美丝袜| 亚洲丝袜在线视频| 国产精品福利电影一区二区三区四区| 一呦二呦三呦国产精品| 四虎影视在线播放| 午夜精品美女久久久久av福利| 一本大道久久加勒比香蕉| 成人免费在线观看入口| 影音先锋日韩资源| 国产激情欧美| 黄页网站在线观看| 亚洲精品日韩在线观看| 欧美激情aaaa| 欧美精品在线一区二区| 99精品久久免费看蜜臀剧情介绍| 天堂成人娱乐在线视频免费播放网站 | 日韩视频在线观看一区二区| 国产精品一区专区| 精品久久ai电影| 日本大臀精品| 亚洲人成网站在线观看播放| 欧美日韩福利视频| 欧美日韩一级二级| 26uuu色噜噜精品一区| 日韩电影免费网址| 欧美少妇精品| 美女无遮挡网站| 天堂va久久久噜噜噜久久va| 午夜精品一区二区三区在线播放| 欧美日韩国产天堂| 欧美高清在线精品一区| 久久久久国内| 久久不见久久见中文字幕免费| 成人超碰在线| 天堂资源中文在线| 欧美日韩在线视频一区二区三区| 国产精品一区而去| 欧美综合激情网| 亚洲欧美制服第一页| 欧美在线短视频|