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

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


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

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

评论

重复

#1 楼

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

评论


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

– Casebash
2010年5月13日23:14

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

– Timo
2013年6月12日上午10:56

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

–钼
2014年7月21日在8:09

你能在这里看看问题stackoverflow.com/q/29116574/3828908

–萨尔曼语
15年3月27日在7:58

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

–岑萨布鲁(Zensaburou)
2015年11月30日23:25

#2 楼

补充@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怎么办?我们如何获得这个价值?

–错误发生
2015年11月5日下午6:36

没关系,在这里得到SO的答案。

–错误发生
2015年11月5日在7:49

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

– Pradeep Chakravarti古迪帕蒂
17 Mar 30 '17在15:53

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

–马丁
18年6月16日在15:22

#3 楼

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

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

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

评论


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

– punnie
10 Mar 16 '10在16:16

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

– Hackbod
10 Mar 16 '10在18:03

Youtube会执行@hackbod的建议,但是从Facebook打开Youtube链接会打开浏览器,而不是Youtube应用。这种机制是否太“微妙”?

– AlikElzin-kilaka
2012年4月4日9:56



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

–乔科维茨
13-10-10在23:08

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

–icyerasor
'18 -10-2在21:24



#4 楼

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

https://github.com/airbnb/DeepLinkDispatch

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

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


作为一个加号,查询参数也将作为好吧。

#5 楼

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

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

现在,您可以使用Android Studio选项轻松添加URI方案:工具> App Links Assistant。到Android文档:https://developer.android.com/studio/write/app-link-indexing.html