[英]Open an Android app via a URL in the browser
好的,所以我知道必須有比這更多的東西。 我在這里閱讀了很多答案,都說同樣的話,但對我不起作用。 我希望能夠使用帶有自定義 URL 方案的鏈接從瀏覽器打開 Android 應用程序。 首先,我正在使用模擬器(實際上是 Genymotion),所以我不知道這是否與它有關。 我看到的答案一直在說我需要的只是與此類似的東西:
<intent-filter>
<data android:scheme="myapp" android:host="hello"/>
<action android:name="ANDROID.INTENT.ACTION.VIEW"/>
<category android:name="ANDROID.INTENT.CATEGORY.BROWSABLE"/>
<category android:name="ANDROID.INTENT.CATEGORY.DEFAULT"/>
</intent-filter>
我把它放在一個新的空白活動上,而不是主要活動上。
如果我理解正確,任何以myapp://hello
開頭的 URL 都將使用該意圖過濾器打開活動。 但是,無論我嘗試什么,我都會在瀏覽器中不斷收到 ERR_UNKNOWN_URL_SCHEME。 這是庫存的 Android 瀏覽器,因為我不能將 Chrome 放在 Genymotion 上(至少不是免費版本)。 這是需要 Chrome 的東西嗎? 它只能在實際設備上完成嗎? 有什么我做錯了嗎?
這里有幾件事情在起作用。
首先,正如 Blackbelt 所指出的,Android 區分大小寫,大多數編程語言和開發環境也是如此。 您需要按照這些操作和類別的文檔將其更改為正確的情況:
<intent-filter>
<data android:scheme="myapp" android:host="hello"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
其次,並非所有的 Web 瀏覽器都像myapp://
一樣處理方案。 我不知道在任何司法管轄區有任何關於書籍的法律迫使開發商尊重它們。 您將遇到三種基本模式:
有些瀏覽器可能會處理得很好
當在頁面上的鏈接中使用此類 URL 時,某些瀏覽器會處理它們,但如果在地址欄中鍵入 URL,則不會處理它們
一些瀏覽器不會嘗試找到一個活動來處理它們並且一直失敗
Google 的首選替代方案是使用http
或https
方案,主機和路徑由您控制。 一些瀏覽器將始終打開該網頁,但其他瀏覽器會檢查、查看是否存在宣傳支持該 URL 的活動,並讓用戶選擇如何處理它。 Android 的“M”版本將提供更多可以繞過選擇器的鈎子( “應用鏈接” )。 此外,其他應用程序(例如,短信客戶端、電子郵件客戶端)通常會將http
鏈接設為可點擊,允許用戶選擇打開您的應用程序,而很少有應用程序知道myapp://hello
以同樣的方式有意義。
如果 url 是http://www.example.com/test/test1表示使用以下代碼:
在android清單文件中添加
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Holo.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:label="@string/app_name" >
<action android:name="android.intent.action.VIEW" />
<!-- Accepts URIs that begin with "http://example.com/test/test1" -->
<data
android:host="www.example.com"
android:pathPrefix="/test/test1"
android:scheme="http" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
問題在於沒有標准——所以每個解決方案都會有它的缺陷。
經過大量研究和工作,我建議在任何地方使用Android 應用程序鏈接(http/s 鏈接),並使用自定義應用程序方案( myapp://...
)回退到具有深層鏈接的頁面。
可以使用代理服務器處理回退 - 如果應用程序鏈接不起作用,它將打開瀏覽器以獲取具有打開 URL 的網頁。
它經過測試並證明可以捕獲所有已知的陷阱。
順便說一句:當今大多數流行的瀏覽器都可以在 Android 上完美地處理自定義應用程序方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.