【问题标题】:force open android app through schema通过架构强制打开 android 应用程序
【发布时间】:2016-12-10 11:45:58
【问题描述】:

这是我的故事。我有一个共享我的网站链接的 android 应用程序。在 Android 设备上,我想检查用户是否让我的 android 应用程序打开了 android 应用程序并显示该链接的相应内容,但如果我的应用程序没有在浏览器中打开该链接。我为此使用DeepLinkDispatch,但我有一个问题,当用户单击共享链接时,android 要求客户端选择打开此链接的应用程序(包括我的应用程序),但我想强制打开我的应用程序。 (如果安装在设备上)

【问题讨论】:

  • 试着编辑你的问题,很难理解你真正想要的是什么。

标签: android android-intent schema uri deep-linking


【解决方案1】:

您必须在带有动作视图的清单文件中的活动意图过滤器中定义意图类别、默认和可浏览的 android:scheme、android:host 和 android:pathPrefix。 例如,如果 url 是:“http://www.example.com/gizmos”。 android会根据数据中的host、scheme和path前缀找到可以处理url的intent。要让操作系统找到您的意图,您必须在应用中添加以下过滤器。

<activity
android:name="com.example.android.GizmosActivity"
android:label="@string/title_gizmos" >
<intent-filter android:label="@string/filter_title_viewgizmos">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
    <data android:scheme="http"
          android:host="www.example.com"
          android:pathPrefix="/gizmos" />
    <!-- note that the leading "/" is required for pathPrefix-->
    <!-- Accepts URIs that begin with "example://gizmos” -->
    <data android:scheme="example"
          android:host="gizmos" />
</intent-filter>

测试深层链接:您可以从 shell 中测试深层链接,如下所示:

adb shell am start -W -a android.intent.action.VIEW -d "http://www.example.com/gizmos" packageIDofYourApp

您可以在 developer site 上深入了解 deplinking

验证您的应用是否可以接收意图您可以使用包管理器检查您的应用是否可以处理具有特定 url 的意图:

Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("http://www.example.com/gizmos"));

    PackageManager packageManager = getPackageManager();
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
    boolean isIntentSafe = activities.size() > 0;
    System.out.println("print pack:"+ ((isIntentSafe == true) ? activities.get(0).activityInfo.packageName : "No package found"));

【讨论】:

  • 我实现了这部分,我只是想强制设备打开我的应用程序而不要求客户端选择它。
【解决方案2】:

这在 Android 6.0 之前是不可能的。

在 Android 6.0+ 上,您可以使用 automatic verification of app links 请求您的应用成为处理某些 URL 的应用程序,当它们在 ACTION_VIEW Intents 中使用时。

但是:

  • Web 浏览器不必使用ACTION_VIEW 作为 URL。欢迎使用 Web 浏览器来加载由 URL 标识的网页。

  • 我不知道应用链接验证是否适用于 IntentACTION_VIEW 之外的操作。您的问题表明该 URL 可能会在 ACTION_SEND 中使用。

  • 用户可以进入“设置”并阻止您的应用处理 URL。

【讨论】:

  • 谢谢,我明白了,但我还有一个问题,当我打开电报频道链接时,它会转到它的网站并自动打开移动应用程序而无需询问客户。所以我的问题是这是如何工作的? (即使在 android pre 6.0 上)
  • @MostafaDavodi:在应用程序中打开链接的唯一方法,即“保证”仅访问该应用程序,是该链接不被其他任何东西所接受。由于 Web 浏览器将支持所有 httphttps URL,这意味着您需要使用自定义模式(例如,telegram)。尤其是 Telegram,有支持 tgtgb 方案的活动。但是,许多应用程序不会尊重此类 URL。例如,SMS 客户端可能无法识别 tg://... 是一个 URL 并使其可点击。
  • @MostafaDavodi:更重要的是,这不支持您的要求(“但如果我的应用程序没有在浏览器中打开该链接”)。当 Web 浏览器遇到指向tg://... URL 的链接时,它可能愿意尝试ACTION_VIEW 来启动应用程序。但是,如果没有为此安装应用程序,浏览器将无法自动将其映射到某个https URL 以显示网页。
  • 我知道我们可以使用自定义模式仅加载我的应用程序,但例如在电报中,当您单击频道链接时,它会转到网站,如果应用程序安装在设备中,则直接打开它,如果不行,打开电报网站。
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
相关资源
最近更新 更多