通过模式强制打开 android 应用程序

force open android app through schema

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

在 Android 6.0.

之前这是不可能的

在 Android 6.0+ 上,您可以使用 automatic verification of app links 请求您的应用程序处理某些 URLs,当它们在 ACTION_VIEW Intents.

但是:

  • Web 浏览器不必为 URL 使用 ACTION_VIEW。欢迎 Web 浏览器加载由 URL.

  • 标识的网页
  • 我不知道应用 link 验证是否适用于除 ACTION_VIEW 之外的 Intent 操作。您的问题表明 URL 可能会用在 ACTION_SEND 中。

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

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

<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>

测试深度 link: 您可以从 shell 测试深度link,如下所示:

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"));