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

pun*_*nie 159 browser android uri intentfilter android-intent

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

myapp://path/to/what/i/want?d=This%20is%20a%20test
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*Lew 212

这是非常可能的; 您可以使用该<data>元素在AndroidManifest.xml中定义URI方案.您设置了一个<data>填充了元素的intent过滤器,您将能够创建自己的方案.(更多关于意图过滤器和意图解决方案.)

这是一个简短的例子:

<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>
Run Code Online (Sandbox Code Playgroud)

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

  • 我花了一段时间才弄清楚要链接到一个特定的路径,"android:path"变量必须指定协议后的所有内容,即.它必须是"youtube.com/myvideo"的形式 (11认同)
  • 工作得很好,但我怎样才能读取MyUriActivity网址中给出的GET参数"d"的值? (2认同)

Die*_*mar 66

补充@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");
}
Run Code Online (Sandbox Code Playgroud)

  • 没关系,得到了答案[这里](http://stackoverflow.com/a/2958870/1708390). (3认同)

hac*_*bod 25

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

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

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

  • 我倾向于定义我自己的方案,以便我可以使用相同的Web逻辑来启动我的iOS应用程序或我的Android应用程序.只需2美分 (19认同)
  • 好的......但为什么不做正确的事呢?这不是什么重要的工作. (5认同)
  • 感谢您的提醒,但我将在封闭的环境中使用它来尝试证明一个概念.如果这个实验永远处于测试阶段,我肯定会考虑批准整个交易. (2认同)
  • Youtube会执行@hackbod的建议,但是**从Facebook打开Youtube链接会打开浏览器,而不是Youtube应用。这种机制是否太“微妙”? (2认同)
  • @hackbod 我认为他们在写那个 rfc 时并没有想到 Android。虽然我 100% 同意你“没有必要”创建一个新方案,但我认为原因正是如此:甚至没有必要实现目标。现在......当您使用 facebook、whatsapp 或其他大型、成熟的技术工具时 - “不要创建新的 URI 方案” - 规则当然不再适用于您。当您的名字已经与全球范围内的公司绑定时,方案名称不会发生冲突。 (2认同)

Wei*_*ang 8

正如几年前提出的问题一样,Android 在这个 URI 方案上已经发展了很多。
从最初的URI方案,到深层链接,再到现在的Android应用程序链接。

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

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


Chr*_*ian 6

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

https://github.com/airbnb/DeepLinkDispatch

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

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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


归档时间:

查看次数:

166966 次

最近记录:

6 年,4 月 前