標籤:android style blog http color io os ar 使用
今天老大給我提了一個需求叫我調研一下,他已經測試了IOS平台上是可以的,需求很簡單就是在系統瀏覽器中通過輸入一個uri就可以開啟相應的app。
比如你在IOS中的系統瀏覽器中輸入:tel://123,就會跳到撥打到電話頁面而且撥打號碼是123,像這樣的命令,老大他用了小米手機測試了一下,發現可以的,所以他就以為Android的也是可以的,但是當我用三星和htc手機測試發現不行,這時候老大就糾結了,但是我個人認為,我們都知道小米手機是模仿IOS的,沒想到模仿的這麼想。所以老大就叫我去調研,我查閱了資料之後,找到瞭解決辦法如下
先上一份代碼,經樓主驗證是絕對可以用的而且也比較清晰的代碼!(ps:還是先劇透下吧,第三方大部分瀏覽器無法成功。)
點擊瀏覽器中的URL連結,啟動特定的App。
首先做成HTML的頁面,頁面內容格式如下:
<a href="[scheme]://[host]/[path]?[query]">啟動應用程式</a>
這一句就可以了。
各個項目含義如下所示:
scheme:判別啟動的App。 ※詳細後述
host:適當記述
path:傳值時必須的key ※沒有也可以
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,獵豹,歐朋?放棄吧,試試系統內建瀏覽器或者Google瀏覽器吧。肯定能成功的,不能成功的話再來坑我。哈哈。
還有,如果你的手機是小米的,那麼恭喜你,下載Google瀏覽器是用不了的!小米系統預設瀏覽器是模仿Google的,但是有刪除了很多機制卻又完全剔除,各種崩潰報錯,需要下載穀
歌架構進行輔助(360手機小幫手裡去搜尋),即使下載了Google架構也不能保證Google瀏覽器能用,本人的小米1測試不能用,米2可以。。。。還是建議不用小米手機做測試,天坑啊!
——————————————————————————————————我是分割線————————————————————————————————————
突然覺得好悲哀,好不容易get了這個技能,卻不能被第三方瀏覽器使用。在這個android瀏覽器大部分被第三方佔據著的時代不得不說是個悲劇啊。
接下來還是說說為什麼第三方瀏覽器不能成功吧。首先,我發現的是UC瀏覽器,如果你使用了自己的scheme,而不是http的話,uc會預設在你的scheme前面添加http://。這太坑爹了。其他瀏覽器沒看是不是同樣的情況。發現這個問題後我就試著把自己的scheme換成http。然後滿懷期待的又跑了一遍,結果還是坑爹了。所以我想會不會是第三方瀏覽器對url做了處理。到這裡,我也無可奈何了。我測試了UC,獵豹,歐朋,這3個都不支援。系統內建的和Google瀏覽器是支援的。
最後再補充個線索吧,在瀏覽器裡搜尋百度應用。進了他們的頁面後,他們是可以實現在各種瀏覽器啟動已經安裝好的本地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
Android實現通過瀏覽器點選連結開啟本地應用(APP)並拿到瀏覽器傳遞的資料(轉)