Android实现通过浏览器点击链接打开本地应用(APP)
Android實(shí)現(xiàn)通過瀏覽器點(diǎn)擊鏈接打開本地應(yīng)用(APP)并拿到瀏覽器傳遞的數(shù)據(jù)
今天老大給我提了一個(gè)需求叫我調(diào)研一下,他已經(jīng)測試了iOS平臺上是可以的,需求很簡單就是在系統(tǒng)瀏覽器中通過輸入一個(gè)uri就可以打開相應(yīng)的app。
比如你在ios中的系統(tǒng)瀏覽器中輸入:tel://123,就會(huì)跳到撥打電話頁面而且撥打號碼是123,像這樣的命令,老大他用了小米手機(jī)測試了一下,發(fā)現(xiàn)可以的,所以他就以為Android的也是可以的,但是當(dāng)我用三星和htc手機(jī)測試發(fā)現(xiàn)不行,這時(shí)候老大就糾結(jié)了,但是我個(gè)人認(rèn)為,我們都知道小米手機(jī)是模仿IOS的,沒想到模仿的這么想。所以老大就叫我去調(diào)研,我查閱了資料之后,找到了解決辦法如下
先上一份代碼,經(jīng)樓主驗(yàn)證是絕對可以用的而且也比較清晰的代碼!(ps:還是先劇透下吧,第三方大部分瀏覽器無法成功。)
點(diǎn)擊瀏覽器中的URL鏈接,啟動(dòng)特定的App。
首先做成HTML的頁面,頁面內(nèi)容格式如下:
<a href="[scheme]://[host]/[path]?[query]">啟動(dòng)應(yīng)用程序</a>這一句就可以了。
?
各個(gè)項(xiàng)目含義如下所示:
scheme:判別啟動(dòng)的App。 ※詳細(xì)后述
host:適當(dāng)記述
path:傳值時(shí)必須的key ? ? ※沒有也可以
query:獲取值的Key和Value? ※沒有也可以
?
作為測試好好寫了一下,如下:
<a href="myapp://jp.app/openwith?name=zhangsan&age=26">啟動(dòng)應(yīng)用程序</a>?
接下來是android端。
首先在AndroidManifest.xml的MAIN Activity下追加以下內(nèi)容。(啟動(dòng)Activity時(shí)給予)
※必須添加項(xiàng)
<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記述的內(nèi)容加入<data …/>。
其中必須的內(nèi)容僅scheme,沒有其他內(nèi)容app也能啟動(dòng)。
?
※注意事項(xiàng):intent-filter的內(nèi)容【android.intent.action.MAIN】和 【android.intent.category.LAUNCHER】這2個(gè),不能與這次追加的內(nèi)容混合。
? ? ? ? ? ? ? ? ?所以,如果加入了同一個(gè)Activity,請按以下這樣做,否則會(huì)導(dǎo)致應(yīng)用圖標(biāo)在桌面消失等問題。
這樣的話,沒有問題。
?
接下來在Activity中需要取值的地方添加以下代碼,我是直接寫在OnCreate函數(shù)里的:
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完了,是不是很驚奇的發(fā)現(xiàn)用瀏覽器輸入
myapp://jp.app/openwith?name=zhangsan&age=26
是不是404,打不開?
樓主你這不是騙人么!樓主你個(gè)混蛋啊。
客官,稍安勿躁啊,你看看你用的瀏覽器是什么?UC,獵豹,歐朋?放棄吧,試試系統(tǒng)自帶瀏覽器或者谷歌瀏覽器吧。肯定能成功的,不能成功的話再來坑我。哈哈。
——————————————————————————————————我是分割線————————————————————————————————————
突然覺得好悲哀,好不容易get了這個(gè)技能,卻不能被第三方瀏覽器使用。在這個(gè)android瀏覽器大部分被第三方占據(jù)著的時(shí)代不得不說是個(gè)悲劇啊。
接下來還是說說為什么第三方瀏覽器不能成功吧。首先,我發(fā)現(xiàn)的是UC瀏覽器,如果你使用了自己的scheme,而不是http的話,uc會(huì)默認(rèn)在你的scheme前面添加http://。這太坑爹了。其他瀏覽器沒看是不是同樣的情況。發(fā)現(xiàn)這個(gè)問題后我就試著把自己的scheme換成http。然后滿懷期待的又跑了一遍,結(jié)果還是坑爹了。所以我想會(huì)不會(huì)是第三方瀏覽器對url做了處理。到這里,我也無可奈何了。我測試了UC,獵豹,歐朋,這3個(gè)都不支持。系統(tǒng)自帶的和谷歌瀏覽器是支持的。
最后再補(bǔ)充個(gè)線索吧,在瀏覽器里搜索百度應(yīng)用。進(jìn)了他們的頁面后,他們是可以實(shí)現(xiàn)在各種瀏覽器啟動(dòng)已經(jīng)安裝好的本地app的。看到這個(gè)后我就看了下他們頁面的源碼。
在這里他們頁面添加了個(gè)data-sentintent的標(biāo)簽,看到這里,應(yīng)該能確定第三方瀏覽器應(yīng)該是默認(rèn)都不支持發(fā)intent的,只能自己起一個(gè)。根據(jù)前端說,這個(gè)標(biāo)簽應(yīng)該是自定義的。我們前端看源碼的時(shí)候發(fā)現(xiàn)是這樣的
所以最后的結(jié)果應(yīng)該是百度這邊是起了個(gè)端口,然后在應(yīng)用里啟用了一個(gè)服務(wù),來監(jiān)聽這個(gè)端口,來獲取這個(gè)intent。大概就這個(gè)思路了。不過樓主沒有實(shí)際去操作。項(xiàng)目時(shí)間緊,太麻煩了。對了,百度這個(gè)是有集成他們inapp這個(gè)sdk的。
再附上stackoverflow兩個(gè)相關(guān)鏈接: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
總結(jié)
以上是生活随笔為你收集整理的Android实现通过浏览器点击链接打开本地应用(APP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python: numpy tile()
- 下一篇: iOS/Android 微信及浏览器中唤