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

时间:2010-03-15 15:22:46

标签: android android-intent browser uri intentfilter

我想要定义一个URI,例如:

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

必须由我自己的应用程序或服务处理。请注意,该方案为"myapp"而非"http""ftp"。这正是我的意图:为Android OS全局定义自己的URI架构。这可能吗?

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

5 个答案:

答案 0 :(得分:207)

这是非常可能的;您可以使用<data>元素在AndroidManifest.xml中定义URI方案。您设置了填充了<data>元素的intent过滤器,您将能够创建自己的方案。 (More on intent filters and intent resolution here。)

这是一个简短的例子:

<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可以从浏览器打开(一个漂亮的功能)。

答案 1 :(得分:63)

补充@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");
}

答案 2 :(得分:25)

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

如果您只想拥有自己应用的链接,我建议您按照我在此处描述的方法进行操作:

How to register some URL namespace (myapp://app.start/) for accessing your program by calling a URL in browser in Android OS?

答案 3 :(得分:6)

Diego的另一种替代方法是使用库:

https://github.com/airbnb/DeepLinkDispatch

您可以轻松声明您要处理的URI以及您希望通过活动上的注释提取的参数,例如:

Kind

作为一个加号,查询参数也将传递给Activity。

答案 4 :(得分:0)

正如几年前所提的那样,Android在此URI方案上得到了很大发展。
从原始的URI方案到深层链接,再到现在的Android App链接。

Android现在建议使用HTTP URL,而不是定义自己的URI方案。由于Android应用程序链接使用链接到您拥有的网站域的HTTP URL,因此没有其他应用程序可以使用您的链接。您可以从here

检查深层链接和Android App链接的比较

现在,您可以使用Android Studio选项轻松添加URI方案:工具>应用链接助手。 请参考Android文档中的详细信息:https://developer.android.com/studio/write/app-link-indexing.html