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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取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

    文章

    3901

    瀏覽量

    65785
  • SDK
    SDK
    +關注

    關注

    3

    文章

    1066

    瀏覽量

    47720
  • 鴻蒙
    +關注

    關注

    59

    文章

    2527

    瀏覽量

    43788

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

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

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    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 ?1031次閱讀

    鴻蒙系統是基于

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

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

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

    鴻蒙os底層是

    鴻蒙os底層是系統嗎?答案顯然是否定的。根據小編的求證了解發現,華為的鴻蒙操作系統只有一半是鴻蒙系統底層,而另一半卻是
    的頭像 發表于 07-06 09:11 ?1.3w次閱讀

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

    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 ?1646次閱讀
    主站蜘蛛池模板: 亚洲三级在线看 | 风情韵味人妻HD | 飘雪在线观看免费完整版 | 黄梅戏mp3大全 | 99视频国产热精品视频 | 花蝴蝶在线直播观看 | 2021精品国产综合久久 | 日夜啪啪一区二区三区 | 亚洲视频免费观看 | 国产精品成人A蜜柚在线观看 | 99久久久免费精品国产 | 久久久久亚洲日日精品 | 91亚洲精品福利在线播放 | H揉捏娇喘乳叫床NP调教视频 | 热99RE久久精品国产 | 免费成年人在线观看视频 | 欧美人妇无码精品久久 | 亚洲精品中文字幕制 | 美娇妻的性奴史1一4 | www.青青草 | 欧美一第一页草草影院 | 天美传媒在线观看免费完整版 | 国产亚洲精品精品精品 | 久久er99热精品一区二区 | 精品少妇爆AV无码专区 | 中文无码字慕在线观看 | 在线观看a视频 | 女厕所边摸边吃奶边做爽视频 | 在线自拍亚洲视频欧美 | 国产曰韩无码亚洲视频 | 伊人精品视频直播 | 忘忧草日本在线社区WWW电影 | 亚洲日韩一区精品射精 | 午夜宅宅伦电影网中文字幕 | wwww69| 久久香蕉国产线看观看 | 97精品一区二区视频在线观看 | 9久久99久久久精品齐齐综合色圆 | 多肉np一女多男高h爽文现代 | 麻豆一区二区三区蜜桃免费 | 国产成人精品亚洲线观看 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品