通过模式强制打开 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"));
这是我的故事。我有一个 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"));