天天看點

JavaScript 網頁連結調用Android程式

如何讓網頁連結實作啟動Android的應用,網上有說重寫WebView相關的shouldOverrideUrlLoading方法,但是這種理論上能實作,因為你的網頁不是僅僅被你自己的webview來浏覽,你需要做的是讓市面上的浏覽器支援才行。

主要涉及到的問題就是關于Intent在字元串形式和Intent對象之間的轉換。把Intent以字元串的形式傳遞給Android 裡面的java代碼接受,然後解析轉化為對應Intent執行即可,主要涉及java和JavaScript的互動。

Intent是Android開發中常見的API。在處理Android元件中,有着必不可少的作用。Intent可以以兩種方式存在。

Intent對象。用于在程式中處理,在處理Android元件時使用。

字元串形式的URI。 用于在非程式代碼中,如網頁中進行使用等。

而這裡我們解決我們上面問題的就是後者,字元串形式的Intent。

Intent提供了兩種将對象轉換成字元串URI,一個是推薦的<code>public String toUri (int flags)</code>, 在API 4加入,将Intent對象轉換成字元串形式的URI。字元串形式的URI可以包含Intent的data,action,categories, type, flags, package, component和extras。

  

另一個方法是<code>public String toURI ()</code>, 這是一個棄用的方法,因為它生成的字元串以#開頭,放在連結上會被當成錨點。不建議使用使用這個方法。

上面的Intent對象使用toUri轉換成

這個方法隻适用于處理以#開頭的URI,而且在其方法内部實際上是調用的<code>parseUri(uri, 0)</code>來實作的。這個方法已經被比較為棄用,不推薦使用。

getIntentOld既可以支援#開頭的URI轉換成Intent對象,如果uri不是Intent的字元串形式,那麼也會傳回一個Intent,隻是其data部分為uri,action為android.intent.action.VIEW。

這個是最完整的轉換方法。接收uri和flag作為參數。支援将字元串形式的URI轉成Intent對象.

以下為一個既可以解析intent:開頭的URI也可以解析#Intent開頭的URI的方法。

對于Intent字元串形式URI在網頁連結中的應用存在安全隐患,在烏雲平台已經有人發現漏洞,使用需要謹慎。使用addJavascriptInterface在安卓4.2以下是有安全漏洞的,可以用這篇文章http://www.pedant.cn/2014/07/04/webview-js-java-interface-research/ 的方法來避免這個漏洞,另外傳參也可以是自定義對象,functuon異步回調等等,傳回值也可以自定義。

轉自: http://droidyue.com/blog/2014/11/23/start-android-application-when-click-a-link/