色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙應用如何喚起 QQ 安卓客戶端進行授權

OpenHarmony技術社區 ? 來源:HarmonyOS技術社區 ? 作者:HarmonyOS技術社區 ? 2022-01-04 15:01 ? 次閱讀

因為鴻蒙系統剛出不久,官方的第三方登錄 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){
//已登錄,跳轉至MyAbility
IntentmyIntent=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{
//未登錄,跳轉至LoginAbility
IntentloginIntent=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 組件。







登錄界面的 AbilitySlice LoginAbilitySlice.java,需要用到的幾個常量如下:

Stringstate=UUID.randomUUID().toString();//唯一標識,成功授權后回調時會原樣帶回。
Stringclient_id="101***151";//QQ開放平臺應用APPID
Stringredirect_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);//支持JavaScript
myWebView.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即將打開一個鏈接時調用該方法
@Override
publicbooleanisNeedLoadUrl(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);
//向自己的服務器請求token
newThread(newRunnable(){
@Override
publicvoidrun(){
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(){
@Override
publicvoidrun(){
//將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-0
Stringstate=UUID.randomUUID().toString();//唯一標識,成功授權后回調時會原樣帶回。
Stringclient_id="101547151";//QQ開放平臺應用APPID
Stringredirect_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;
@Override
publicvoidonStart(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即將打開一個鏈接時調用該方法
@Override
publicbooleanisNeedLoadUrl(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);
//向自己的服務器請求token
newThread(newRunnable(){
@Override
publicvoidrun(){
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(){
@Override
publicvoidrun(){
//將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技術社區】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3794

    瀏覽量

    64359
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1035

    瀏覽量

    45899
  • 鴻蒙
    +關注

    關注

    57

    文章

    2339

    瀏覽量

    42805

原文標題:在鴻蒙上實現QQ第三方登錄!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    2012微信電腦客戶端免費下載

    的彩信不用再在意彩信費用,因為它完全免費,即時拍照即時分享。  同所有同類的聊天軟件一樣,微信也能設置自己的個人信息和頭像,更方便你的好友快速的找到你。  微信目前就是簡單的手機客戶端,沒有電腦
    發表于 09-13 18:59

    如何看待鴻蒙系統兼容系統?

    網絡看到很多人討論鴻蒙,有人說鴻蒙就是換皮版的,有人說
    發表于 10-10 11:06

    鴻蒙取代?這下鴻蒙開發者要坐不住了!

    授權。僅這一點,華為做的事情,就應當受到國人的支持。換句話說,華為現如今不開發鴻蒙OS系統,谷歌全面斷供國產手機的情況一旦出現。手機直接變成“板磚”,屆時對于國內的手機市場造成的
    發表于 12-08 09:33

    CSDN博客客戶端源碼

    CSDN博客客戶端源碼CSDN博客客戶端源碼CSDN博客客戶端源碼
    發表于 11-18 10:22 ?1次下載

    Android 仿QQ客戶端及服務源碼

    Android 仿QQ客戶端及服務源碼
    發表于 03-19 11:23 ?3次下載

    iOS淘寶客戶端應用名稱發生變化 Android客戶端應用名稱尚未更改

    iOS淘寶客戶端應用名稱發生變化 Android客戶端應用名稱尚未更改
    發表于 04-18 15:37 ?929次閱讀

    鴻蒙系統是基于

    有網友詢問鴻蒙系統是基于嗎?答案:鴻蒙系統并不是基于
    的頭像 發表于 06-18 16:17 ?3.1w次閱讀

    鴻蒙系統和系統區別在哪里 鴻蒙的比較

    華為今年正式推出了全新的鴻蒙系統,不少用戶都關心鴻蒙系統和之間的區別,下面就為大家介紹鴻蒙系統和
    的頭像 發表于 06-16 15:41 ?1.4w次閱讀

    鴻蒙好嗎 鴻蒙系統有哪些優勢

    6月2號,鴻蒙系統正式發布,到現在,華為已經有很多機型都能夠升級鴻蒙系統了,升級了的用戶還調侃到“從此是路人”。那么問題來了,鴻蒙
    的頭像 發表于 07-07 15:51 ?1.9w次閱讀

    鴻蒙的底層是鴻蒙是基于

    華為鴻蒙系統2.0自從上線后頗受國人追捧,作為全球首款主打“面向未來”、“萬物互聯”的分布式全場景操作系統,鴻蒙系統可以說是開創了新的領域。然而很多人質疑鴻蒙系統底層是基于
    的頭像 發表于 07-07 15:08 ?2.7w次閱讀

    鴻蒙是否脫離 鴻蒙的關系

    華為鴻蒙系統2.0發布至今,引發很多人對鴻蒙系統與系統之間的關聯的困惑,鴻蒙系統是基于
    的頭像 發表于 07-09 15:21 ?1.8w次閱讀

    鴻蒙是基于鴻蒙區別

    很多人很好奇鴻蒙系統和卓有什么關系?鴻蒙系統是基于系統研發而成的?鴻蒙系統與
    的頭像 發表于 07-10 09:36 ?4.6w次閱讀

    鴻蒙基于 鴻蒙系統和卓有什么區別

    華為鴻蒙系統2.0自發布至今備受關注,廣受好評,然而鴻蒙系統其底層也引發了許多人爭議,鴻蒙系統到底有沒有脫離系統?是基于
    的頭像 發表于 07-12 15:05 ?3w次閱讀

    密鑰服務器和客戶端常見問題解答

    OpticStudio網絡版授權被設計用于客戶端-服務器交互模式。密鑰服務器的意義為保有授權,并且將單個授權席位分配給一臺客戶端電腦。
    的頭像 發表于 11-15 10:15 ?1276次閱讀

    MQTT中服務客戶端

    MQTT 是一種基于客戶端-服務架構(C/S)的消息傳輸協議,所以在 MQTT 協議通信中,有兩個最為重要的角色,它們便是服務客戶端。 1)服務
    的頭像 發表于 07-30 14:55 ?2637次閱讀
    主站蜘蛛池模板: 把手戳进美女尿口里动态图| 野草视频在线观看| 午夜宅宅伦电影网| 亚洲国产精品特色大片观看 | 女人18毛片| 日韩人妻无码精品久久中文字幕| 色拍拍噜噜噜久久蜜桃| 甜性涩爱在线播放| 亚洲一区在线视频观看| 91精品国产91| 成人人观看的免费毛片| 国产精品毛片在线视频| 精品国产在线亚洲欧美| 女教师公车痴汉在线播放| 日韩精品一区二区中文| 亚洲国产精品一区二区久久第| 又黄又粗又爽免费观看| AV72啪啪网站| 国产AV视频二区在线观看| 国产精品永久在线| 黄色天堂网站| 嫩草影院未满十八岁禁止入内| 青青青久草| 午夜爱情动作片P| 艳照门在线观看| 精品无码日本蜜桃麻豆| 久热这里在线精品| 欧美日韩精品一区二区三区高清视频 | 亚洲电影第1页| 一本道dvd久久综合高清免费 | 亚洲日本欧美产综合在线| 一本之道高清www在线观看 | 日日久久狠狠8888偷偷色| 日韩欧美一区二区三区在线视频| 少妇一夜未归暴露妓女身份| 学校女性奴sm训练调教| 亚洲视频 在线观看| yellow日本高清在线| 国产精品婷婷久青青原| 久久天天婷婷五月俺也去| 欧美午夜a级精美理论片|