Android實現經過瀏覽器點擊連接打開本地應用(APP)並拿到瀏覽器傳遞的數據(轉)

今天老大給我提了一個需求叫我調研一下,他已經測試了IOS平臺上是能夠的,需求很簡單就是在系統瀏覽器中經過輸入一個uri就能夠打開相應的app。前端

好比你在IOS中的系統瀏覽器中輸入:tel://123,就會跳到撥打電話頁面並且撥打號碼是123,像這樣的命令,老大他用了小米手機測試了一下,發現能夠的,因此他就覺得Android的也是能夠的,可是當我用三星和htc手機測試發現不行,這時候老大就糾結了,可是我我的認爲,咱們都知道小米手機是模仿IOS的,沒想到模仿的這麼想。因此老大就叫我去調研,我查閱了資料以後,找到了解決辦法以下android

先上一份代碼,經樓主驗證是絕對能夠用的並且也比較清晰的代碼!(ps:仍是先劇透下吧,第三方大部分瀏覽器沒法成功。)瀏覽器

 

點擊瀏覽器中的URL連接,啓動特定的App。app

首先作成HTML的頁面,頁面內容格式以下:框架

<a href="[scheme]://[host]/[path]?[query]">啓動應用程序</a> 

這一句就能夠了。函數

 

各個項目含義以下所示:測試

scheme:判別啓動的App。 ※詳細後述url

host:適當記述spa

path:傳值時必須的key     ※沒有也能夠code

query:獲取值的Key和Value  ※沒有也能夠

 

做爲測試好好寫了一下,以下:

<a href="myapp://jp.app/openwith?name=zhangsan&age=26">啓動應用程序</a>  

 

接下來是Android端。
首先在AndroidManifest.xml的MAIN Activity下追加如下內容。(啓動Activity時給予)

※必須添加項

<intent-filter>  
    <action android:name="android.intent.action.VIEW"/>  
    <category android:name="android.intent.category.DEFAULT" />  
    <category android:name="android.intent.category.BROWSABLE" />  
    <data android:scheme="myapp" android:host="jp.app" android:pathPrefix="/openwith"/>  
</intent-filter>

HTML記述的內容加入<data …/>。
其中必須的內容僅scheme,沒有其餘內容app也能啓動。

 

※注意事項:intent-filter的內容【android.intent.action.MAIN】和 【android.intent.category.LAUNCHER】這2個,不能與此次追加的內容混合。
                 因此,若是加入了同一個Activity,請按如下這樣作,不然會致使應用圖標在桌面消失等問題。

複製代碼
<intent-filter>  
    <action android:name="android.intent.action.MAIN"/>  
    <category android:name="android.intent.category.LAUNCHER" />  
</intent-filter>  
<intent-filter>  
    <action android:name="android.intent.action.VIEW"/>  
    <category android:name="android.intent.category.DEFAULT" />  
    <category android:name="android.intent.category.BROWSABLE" />  
    <data android:scheme="myapp" android:host="jp.app" android:pathPrefix="/openwith"/>  
</intent-filter> 
複製代碼

這樣的話,沒有問題。

 

接下來在Activity中須要取值的地方添加如下代碼,我是直接寫在OnCreate函數裏的:

 
Intent i_getvalue = getIntent();  
String action = i_getvalue.getAction();  
  
if(Intent.ACTION_VIEW.equals(action)){  
    Uri uri = i_getvalue.getData();  
    if(uri != null){  
        String name = uri.getQueryParameter("name");  
        String age= uri.getQueryParameter("age");  
    }  
}
 

這樣就能獲取到URL傳遞過來的值了。

——————————————————————————————————我是分割線————————————————————————————————————

 

代碼copy完了,是否是很驚奇的發現用瀏覽器輸入

 

myapp://jp.app/openwith?name=zhangsan&age=26

是否是404,打不開?

樓主你這不是騙人麼!樓主你個混蛋啊。

客官,稍安勿躁啊,你看看你用的瀏覽器是什麼?UC,獵豹,歐朋?放棄吧,試試系統自帶瀏覽器或者谷歌瀏覽器吧。確定能成功的,不能成功的話再來坑我。哈哈。

還有,若是你的手機是小米的,那麼恭喜你,下載谷歌瀏覽器是用不了的!小米系統默認瀏覽器是模仿谷歌的,可是有刪除了不少機制卻又徹底剔除,各類崩潰報錯,須要下載谷

歌框架進行輔助(360手機助手裏去搜索),即便下載了谷歌框架也不能保證谷歌瀏覽器能用,本人的小米1測試不能用,米2能夠。。。。仍是建議不用小米手機作測試,天坑啊!

 

——————————————————————————————————我是分割線————————————————————————————————————

忽然以爲好悲哀,好不容易get了這個技能,卻不能被第三方瀏覽器使用。在這個android瀏覽器大部分被第三方佔據着的時代不得不說是個悲劇啊。

 

接下來仍是說說爲何第三方瀏覽器不能成功吧。首先,我發現的是UC瀏覽器,若是你使用了本身的scheme,而不是http的話,uc會默認在你的scheme前面添加http://。這太坑爹了。其餘瀏覽器沒看是否是一樣的狀況。發現這個問題後我就試着把本身的scheme換成http。而後滿懷期待的又跑了一遍,結果仍是坑爹了。因此我想會不會是第三方瀏覽器對url作了處理。到這裏,我也迫不得已了。我測試了UC,獵豹,歐朋,這3個都不支持。系統自帶的和谷歌瀏覽器是支持的。

 

最後再補充個線索吧,在瀏覽器裏搜索百度應用。進了他們的頁面後,他們是能夠實如今各類瀏覽器啓動已經安裝好的本地app的。看到這個後我就看了下他們頁面的源碼。

在這裏他們頁面添加了個data-sentintent的標籤,看到這裏,應該能肯定第三方瀏覽器應該是默認都不支持發intent的,只能本身起一個。根據前端說,這個標籤應該是自定義的。咱們前端看源碼的時候發現是這樣的

因此最後的結果應該是百度這邊是起了個端口,而後在應用裏啓用了一個服務,來監聽這個端口,來獲取這個intent。大概就這個思路了。不過樓主沒有實際去操做。項目時間緊,太麻煩了。對了,百度這個是有集成他們inapp這個sdk的。

再附上stackoverflow兩個相關連接:http://stackoverflow.com/questions/3469908/make-a-link-in-the-android-browser-start-up-my-app

http://stackoverflow.com/questions/2958701/launch-custom-android-application-from-android-browser

相關文章
相關標籤/搜索