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
评论
重复