Android中WebView實現(xiàn)點擊超鏈接啟動QQ的方法
前言
之前有次在面試的時候,面試官問了一個如何在WebView點擊超鏈接啟動類型QQ類似第三方應(yīng)用,我當時的回答是用WebView與js交互可以做到。面試官聽了沒再說什么,應(yīng)該是答案不是他期望的。今天發(fā)現(xiàn)原來可以這樣實現(xiàn),記錄一下。
實現(xiàn)思路
在Web開發(fā)中,啟動QQ來臨時會話,可以通過一個URL鏈接
<a target="_blank" rel="external nofollow" >啟動QQ</a>
把20178888換成你的QQ號即可。在Android手機有些瀏覽器里這樣也可以正常被調(diào)用。
但如果我們要使用Webview展示W(wǎng)eb頁面,頁面里包含了上面的鏈接,卻無法正常的啟動QQ。
我們可以在WebView里重載 setWebViewClient方法
mWebView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });
這樣Webview里面的超鏈接要是被觸發(fā)了,Webview會去加載替代默認瀏覽器加載。
http://wpa.qq.com/msgrd?v=3&uin=748895431&site=qq&menu=yes
這個鏈接我們看起來這是一個很正常的http請求,通過抓包發(fā)現(xiàn)調(diào)用的QQ不僅僅是進行一次http的請求,實際還發(fā)送了這么一個請求:mqqwpa://im/chat開頭的。
mqqwpa:// 這部分URL的部分,叫做URL的sechme部分。
這里就比較好理解為什么會跳到騰訊應(yīng)用寶官網(wǎng),http://wpa.qq.com/是騰訊應(yīng)用寶的官網(wǎng),這是第一次請求,
由于它接著再次請求的協(xié)議不是http而是mqqwpa://im/chat。
而實際上真正調(diào)用QQ的是mqqwpa://im/chat,這時我們應(yīng)該使用一個Intent來操作調(diào)用原生的QQ。
我們需要捕獲這些url,當遇到普通網(wǎng)頁交給Webview處理,走正常流程;當遇到以mqqwpa開頭的,交給默認瀏覽器處理。
這樣WebView點擊超鏈啟動QQ問題就解決了。
下面我們來看實現(xiàn)方式:
其實我們重載 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則會開啟一個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則會開啟一個Acitity然后去調(diào)用原生APP Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(in); return null; } } });
運行效果
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對各位Android開發(fā)者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android使用selector修改TextView中字體顏色和背景色的方法
這篇文章主要介紹了Android使用selector修改TextView中字體顏色和背景色的方法,實例分析了selector方法的相關(guān)使用技巧,需要的朋友可以參考下2016-01-01Android中ProgressDialog的dismiss()與cancel()方法的區(qū)別
本文主要介紹了Android中ProgressDialog的dismiss()與cancel()方法的區(qū)別,具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04Android編程之截屏實現(xiàn)方法(包括scrollview與listview)
這篇文章主要介紹了Android編程之截屏實現(xiàn)方法,包括截取scrollview與listview屏幕的相關(guān)技巧,以及截屏圖片的生成與保存技巧,需要的朋友可以參考下2015-11-11Android使用ViewDragHelper實現(xiàn)QQ聊天氣泡拖動效果
這篇文章主要為大家詳細介紹了Android使用ViewDragHelper實現(xiàn)QQ聊天氣泡拖動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01Android?WebRTC?對?AudioRecord?的使用技術(shù)分享
這篇文章主要介紹了Android?WebRTC?對?AudioRecord?的使用技術(shù)分享,AudioRecord?是?Android?基于原始PCM音頻數(shù)據(jù)錄制的類,接下來和小編進入文章了解更詳細的內(nèi)容吧2022-02-02Android Handler,Message,MessageQueue,Loper源碼解析詳解
這篇文章主要介紹了Android Handler,Message,MessageQueue,Loper源碼解析詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09