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


161

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

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

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

这在某种程度上类似于某些程序已经在Windows系统上执行的操作,例如Skype(skype://)或任何torrent下载程序(torrent://)。


Answers:


215

这是很有可能的。您可以使用<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从浏览器中打开(一个很漂亮的功能)。


11
我花了一段时间才弄清楚,要链接到特定路径,“ android:path”变量必须在协议之后指定所有内容,即。它的格式必须为“ youtube.com/myvideo”
Casebash 2010年

2
效果很好,但是如何从MyUriActivity读取url中给定的GET参数“ d”的值?
Timo 2013年

对我不起作用,我有多个针对同一活动的Intent过滤器。一个用于主发射器。第二个用于打开特定文件(如上)第三,前两个工作正常,但第三个工作不正常。
最高法院

您能在这里查看问题吗stackoverflow.com/q/29116574/3828908
萨尔曼2015年

1
上述链接的英语版本,以防万一有人需要。
Zensaburou 2015年

67

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

如果链接是什么样http://www.host.com/directory/value?我们怎么能得到这个value
错误发生

3
没关系,在这里得到SO的答案。
错误发生

如何在不使用元数据的情况下通过代码读取AndroidManifest.xml中的数据标签。我也需要在oauth调用中将确切的方案,路径和主机发送到服务器。我不想复制回叫声明!
Pradeep Chakravarti Gudipati

@BugsHappen这是最后一个URI路径段。使用uri.getLastPathSegment();
马丁

25

我强烈建议您不要定义自己的方案。这与URI方案的Web标准背道而驰,后者出于正当理由试图严格控制这些名称-避免不同实体之间的名称冲突。将指向您的方案的链接放在网站上之后,您已经将那个小名字放在整个Internet的整个命名空间中,并且应该遵循这些标准。

如果您只希望能够链接到您自己的应用程序,建议您遵循此处介绍的方法:

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


2
感谢您的注意,但是我将仅在封闭环境中使用它来证明一个概念。如果该实验离开测试阶段,我肯定会考虑批准整个交易。
punnie 2010年

5
好吧...但是为什么不做正确的事呢?没有更多的工作要做。
Hackbod 2010年

2
Youtube会执行@hackbod的建议,但是从Facebook打开Youtube链接会打开浏览器,而不是Youtube应用。这个机制太“精致”了吗?
AlikElzin-kilaka 2012年

19
我倾向于定义自己的方案,以便可以使用相同的网络逻辑来启动我的iOS应用程序或我的Android应用程序。我的2美分
Chicowitz

1
@hackbod我不认为他们在编写rfc时会想到android。尽管我100%与您保持联系,没有必要创建新的计划,但我认为原因恰恰是:甚至没有必要实现目标。而现在..当您像facebook,whatsapp或其他大型的成熟技术工具一样时,“不要创建新的URI方案”规则将不再适用于您。当您的名字已经与全球范围内的公司绑定在一起时,方案名称将不会发生冲突。
icyerasor

6

迭戈的另一种替代方法是使用一个库:

https://github.com/airbnb/DeepLinkDispatch

您可以通过Activity上的注释轻松声明要处理的URI和要提取的参数,例如:

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

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


1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.