首页 > 解决方案 > Android 如何打开一个基于 Intent 的 Chrome URI

问题描述

Chrome 文档中,我了解到可以使用以下 URI 打开应用程序

intent:  
   HOST/URI-path // Optional host  
   #Intent;  
      package=\[string\];  
      action=\[string\];  
      category=\[string\];  
      component=\[string\];  
      scheme=\[string\];  
   end;

我想知道是否可以从我的应用程序中打开此 URI。

示例 URI

intent:
    //qr/json/%7B%22u%22%3A%22https%3A%2F%2Fprivacybydesign.foundation%2Fbackend%2Firma%2Fsession%2FvsRjkZF2B2H17sBWmVZe%22%2C%22irmaqr%22%3A%22disclosing%22%7D
    #Intent;
        package=org.irmacard.cardemu;
        scheme=cardemu;
        l.timestamp=1620907855707;
        S.browser_fallback_url=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dorg.irmacard.cardemu
    ;end

因为它看起来像一个普通的 URI,我想我可以这样打开它:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("%EXAMPLE_URI%"));
startActivity(intent);

这给了我一个ActivityNotFoundException. 我错过了什么?

原因:android.content.ActivityNotFoundException:没有找到处理 Intent { act=android.intent.action.VIEW dat=intent://qr/json/{"u":"https://privacybydesign.foundation/backend 的活动/irma/session/vsRjkZF2B2H17sBWmVZe","irmaqr":"disclosure"} pkg=org.irmacard.cardemu(有附加功能)}

标签: androidurideep-linking

解决方案


Chrome 文档中描述的“intent:”语法用于从网页启动应用程序,Chrome 将处理href并检索参数以通过 Android Intent 启动应用程序。

您提供的示例 URI 的方案是intent://,默认情况下不处理。

如果要处理intent://URI,则需要创建深层链接

如果您想从您的 Android 应用程序打开网页,您可以使用 ACTION_VIEW 操作并在意图数据中指定网页 URL。

public void openWebPage(String url) {
    Uri webpage = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

// example
// openWebPage("https://privacybydesign.foundation/backend/irma/session/vsRjkZF2B2H17sBWmVZe")

有关意图和意图过滤器 的更多信息


推荐阅读