如何在 Android 上实现我自己的 URI 方案

假设我想定义一个 URI,比如:

myapp://path/to/what/i/want?d=This%20is%20a%20test

必须由我自己的应用程序或服务处理。注意,该方案是 "myapp",而不是 "http""ftp"。这正是我想要做的: 为 Android 操作系统定义我自己的全局 URI 模式。这可能吗?

这有点类似于一些程序已经在做的事情,例如,Windows 系统,如 Skype (skype://)或任何种子下载程序(torrent://)。

194459 次浏览

这是非常可能的; 您可以使用 <data>元素在 AndroidManifest.xml 中定义 URI 模式。设置一个意图过滤器,填充 <data>元素,就可以创建自己的方案。(更多关于意图过滤器和意图解析的信息请点击这里)

这里有一个简短的例子:

<activity android:name=".MyUriActivity">
<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="myapp" android:host="path" />
</intent-filter>
</activity>

根据隐式意图的工作原理,您需要定义至少一个操作和一个类别; 在这里,我选择了 VIEW 作为操作(尽管它可以是任何操作) ,并确保添加了 DEFAULT 类别(因为这是所有隐式意图所必需的)。还要注意我是如何添加类别 BROWSABLE 的-这是不必要的,但它将允许您的 URI 可以从浏览器(一个漂亮的功能)。

我强烈建议您不要定义自己的方案。这违背了 URI 方案的 Web 标准,因为 URI 方案有充分的理由试图严格控制这些名称——以避免不同实体之间的名称冲突。一旦你在一个网站上放置了一个指向你的方案的链接,你就已经把这个小小的名字放进了整个互联网的名称空间,并且应该遵循这些标准。

如果你只是想有一个链接到你自己的应用程序,我建议你按照我在这里描述的方法:

如何注册一些 URL 名称空间(myapp://app.start/)访问您的程序通过调用浏览器中的 URL 在 Android 操作系统?

补充 @ DanielLew的答案,为了得到参数的值,你必须这样做:

URI 示例: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

在你的活动中:

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Uri uri = intent.getData();
String valueOne = uri.getQueryParameter("keyOne");
String valueTwo = uri.getQueryParameter("keyTwo");
}

迭戈的另一个替代方法是使用图书馆:

Https://github.com/airbnb/deeplinkdispatch

您可以轻松地声明您想要处理的 URI 和您想要通过活动上的注释提取的参数,比如:

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
...
}

另外,查询参数也将传递给 Activity。

这个问题是多年前提出的,Android 在这个 URI 方案上进化了很多。
从最初的 URI 方案,到深度链接,现在是 Android 应用程序链接。

Android 现在建议使用 HTTP URL,而不是定义您自己的 URI 方案。因为 Android 应用程序链接使用 HTTP URL 链接到您拥有的网站域名,所以没有其他应用程序可以使用您的链接。你可以从 给你中检查深度链接和 Android 应用程序链接的比较

现在您可以使用 Android Studio 选项轻松添加 URI 方案: Tools > App Links Assistant。 请参考 Android 文档: < a href = “ https://developer.Android.com/Studio/write/app-link-indexing.html”rel = “ nofollow norefrer”> https://developer.Android.com/studio/write/app-link-indexing.html