1. 程式人生 > >Android 協議跳轉app

Android 協議跳轉app

協議跳轉

當我們在應用中點選一個協議連結,通常會提示我們選擇合適的瀏覽器或者app去開啟它。

<activity android:name=".MainActivity">
    <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="http" android:host="www.stone86.top" android:pathPattern
="/magic"/>
</intent-filter> </activity>

scheme可以隨意設定。訪問形式還是跟上面類似的: scheme://host/pathPatteren

只是在6.0以後多了一個預設處理。

使app作為給定連結的預設處理者

要想實現Android 6.0 中的”讓app作為對給定型別連結的預設處理者”。要再增加如下配置:

<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW"
/>
<category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="https" android:host="stone86.top" android:pathPattern="/magic"/> </intent-filter>

android:autoVerify="true" 自動會訪問該站點進行驗證。為了自動驗證,向阿里雲申請了一天的https+cdn來測試,實際訪問的是:https://www.stone86.top/.well-known/assetlinks.json。 該驗證服務必須是https的站點;實際測試時,明明站點的json是可以訪問的,但驗證還是沒通過,猜想,可能是國內伺服器的問題

資料夾名必須是.well-known,檔名為assetlinks.json,內容是:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.stone.mvp",
    "sha256_cert_fingerprints":
    ["81:6D:ED:45:12:AE:0D:89:04:CC:5F:DB:E6:BB:62:31:64:4A:14:4D:54:9B:CA:48:95:33:C6:AF:F3:3D:4A:6F"]
  }
}]

可以使用java的keytool命令來獲取fingerprints:$ keytool -list -v -keystore my-release-key.keystore。

當app執行,驗證通過後;再開啟該連結,就會查詢到系統中,已配置了其對應的app,就不會彈出其它可接受網頁category的應用選擇框了;會直接開啟app。

使用命令驗證繫結情況

adb shell am start -a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d "http://www.stone86.top/magic" "com.stone.mvp"

當不含後面的package值時,還是會彈出多app選擇框。因為驗證可能失敗了。

測試網站與url的繫結命令:

adb shell dumpsys package domain-preferred-apps

輸出:

Package: com.google.android.calendar
Domains: www.google.com calendar.google.com
Status:  undefined  //未明確定義

Package: com.stone.mvp
Domains: stone86.top www.stone86.top
Status:  ask        //詢問

Package: com.google.android.youtube
Domains: youtu.be m.youtube.com youtube.com www.youtube.com
Status:  always : 200000001     //有always,表示是 成功

程式碼中應用

  • 用intent,匹配協議,開啟App:
String url = "http://stone86.top/magic?key=stone"; //這裡加了 ?key引數
Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
in.setPackage("com.stone.mvp"); //沒有這句可能會有選擇框,看驗證的繫結情況;反之,有就能直接開啟
startActivity(in);
  • activity中,解析:
val queryParameter = intent?.data?.getQueryParameter("key")
if (queryParameter != null) {
    println("stone.stone  queryParameter=" + queryParameter)
}
  • webview跳轉App:
String url = "http://stone86.top/magic?key=stone";
WebView view = new WebView(this);
view.loadUrl(url); //可能會有選擇框,看驗證的繫結情況

Android Studio 3.0中操作App Links

AS3.0 , 選單欄 Tools > App Links Assistant 可以快速操作 App Links