Android中WebView實(shí)現(xiàn)點(diǎn)擊超鏈接啟動(dòng)QQ的方法
前言
之前有次在面試的時(shí)候,面試官問了一個(gè)如何在WebView點(diǎn)擊超鏈接啟動(dòng)類型QQ類似第三方應(yīng)用,我當(dāng)時(shí)的回答是用WebView與js交互可以做到。面試官聽了沒再說什么,應(yīng)該是答案不是他期望的。今天發(fā)現(xiàn)原來可以這樣實(shí)現(xiàn),記錄一下。
實(shí)現(xiàn)思路
在Web開發(fā)中,啟動(dòng)QQ來臨時(shí)會(huì)話,可以通過一個(gè)URL鏈接
<a target="_blank" rel="external nofollow" >啟動(dòng)QQ</a>
把20178888換成你的QQ號(hào)即可。在Android手機(jī)有些瀏覽器里這樣也可以正常被調(diào)用。
但如果我們要使用Webview展示W(wǎng)eb頁面,頁面里包含了上面的鏈接,卻無法正常的啟動(dòng)QQ。
我們可以在WebView里重載 setWebViewClient方法
mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
這樣Webview里面的超鏈接要是被觸發(fā)了,Webview會(huì)去加載替代默認(rèn)瀏覽器加載。
http://wpa.qq.com/msgrd?v=3&uin=748895431&site=qq&menu=yes
這個(gè)鏈接我們看起來這是一個(gè)很正常的http請(qǐng)求,通過抓包發(fā)現(xiàn)調(diào)用的QQ不僅僅是進(jìn)行一次http的請(qǐng)求,實(shí)際還發(fā)送了這么一個(gè)請(qǐng)求:mqqwpa://im/chat開頭的。
mqqwpa:// 這部分URL的部分,叫做URL的sechme部分。
這里就比較好理解為什么會(huì)跳到騰訊應(yīng)用寶官網(wǎng),http://wpa.qq.com/是騰訊應(yīng)用寶的官網(wǎng),這是第一次請(qǐng)求,
由于它接著再次請(qǐng)求的協(xié)議不是http而是mqqwpa://im/chat。
而實(shí)際上真正調(diào)用QQ的是mqqwpa://im/chat,這時(shí)我們應(yīng)該使用一個(gè)Intent來操作調(diào)用原生的QQ。
我們需要捕獲這些url,當(dāng)遇到普通網(wǎng)頁交給Webview處理,走正常流程;當(dāng)遇到以mqqwpa開頭的,交給默認(rèn)瀏覽器處理。
這樣WebView點(diǎn)擊超鏈啟動(dòng)QQ問題就解決了。
下面我們來看實(shí)現(xiàn)方式:
其實(shí)我們重載 shouldInterceptRequest 方法,來截獲其他的sechme處理即可。
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (url.startsWith("http") || url.startsWith("https")) { //http和https協(xié)議開頭的執(zhí)行正常的流程
return super.shouldInterceptRequest(view, url);
} else { //其他的URL則會(huì)開啟一個(gè)Acitity然后去調(diào)用原生APP
Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(in);
return null;
}
}
});
完整代碼:
mWebView = (ProgressWebView) findViewById(R.id.baseweb_webview);
mWebView.getSettings().setJavaScriptEnabled(true);
String url ="http://wpa.qq.com/msgrd?v=3&uin=748895431&site=qq&menu=yes";
mWebView.loadUrl(url);
mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (url.startsWith("http") || url.startsWith("https")) { //http和https協(xié)議開頭的執(zhí)行正常的流程
return super.shouldInterceptRequest(view, url);
} else { //其他的URL則會(huì)開啟一個(gè)Acitity然后去調(diào)用原生APP
Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(in);
return null;
}
}
});
運(yùn)行效果

總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)各位Android開發(fā)者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android BadTokenException異常解決案例詳解
這篇文章主要介紹了Android BadTokenException異常詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-08-08
Android利用ObjectAnimator實(shí)現(xiàn)ArcMenu
這篇文章主要為大家詳細(xì)介紹了Android利用ObjectAnimator實(shí)現(xiàn)ArcMenu的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-07-07
Flutter學(xué)習(xí)之SliverList和SliverGird的使用詳解
Sliver的組件一般都用在CustomScrollView中,除了SliverAppBar之外,我們還可以為CustomScrollView添加List或者Grid來實(shí)現(xiàn)更加復(fù)雜的組合效果。本文就來聊聊SliverList和SliverGird的使用吧2023-02-02
Android側(cè)滑菜單和輪播圖之滑動(dòng)沖突問題
這篇文章主要介紹了Android側(cè)滑菜單和輪播圖之滑動(dòng)沖突問題,需要的朋友可以參考下2017-06-06
最好用的Android省市區(qū)三級(jí)聯(lián)動(dòng)選擇效果
這篇文章主要為大家詳細(xì)介紹了最好用的Android省市區(qū)三級(jí)聯(lián)動(dòng)選擇效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Android 活動(dòng)條ActionBar的詳解及實(shí)例代碼
這篇文章主要介紹了Android 活動(dòng)條ActionBar的詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android使用Room操作數(shù)據(jù)庫流程詳解
谷歌推薦使用Room操作數(shù)據(jù)庫,Room在 SQLite 上提供了一個(gè)抽象層,在充分利用 SQLite強(qiáng)大功能的同時(shí),能夠流暢地訪問數(shù)據(jù)庫2022-11-11
Android kotlin+協(xié)程+Room數(shù)據(jù)庫的簡(jiǎn)單使用
這篇文章主要介紹了Android kotlin+協(xié)程+Room數(shù)據(jù)庫的簡(jiǎn)單使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01

