Java 如何注册一些URL名称空间(myapp://app.start/)在Android操作系统中,通过在浏览器中调用URL来访问您的程序?
所以我想创建一个安卓应用程序,这样它就可以在安卓操作系统中的某个地方注册(或者只在系统启动时启动),当手机用户在网页浏览器中点击网页上的特殊按钮时,它会:Java 如何注册一些URL名称空间(myapp://app.start/)在Android操作系统中,通过在浏览器中调用URL来访问您的程序?,java,android,browser,Java,Android,Browser,所以我想创建一个安卓应用程序,这样它就可以在安卓操作系统中的某个地方注册(或者只在系统启动时启动),当手机用户在网页浏览器中点击网页上的特殊按钮时,它会: <a href="myapp://mysettings">Foo</a> 我的应用程序将弹出并使用该URL中发送的参数运行 那我该怎么做呢 我需要一个与代码教程 您需要通过W3C等遵守URI的标准规则,这基本上意味着:不要这样做 Android定义了一个Uri语法来描述一般意图。有一些方法可用于在该表示法之间
<a href="myapp://mysettings">Foo</a>
我的应用程序将弹出并使用该URL中发送的参数运行
那我该怎么做呢
我需要一个与代码教程 您需要通过W3C等遵守URI的标准规则,这基本上意味着:不要这样做 Android定义了一个Uri语法来描述一般意图。有一些方法可用于在该表示法之间进行转换,例如: 因此,实现这一点的方法是使用常规工具在清单中描述一个特定组件将要处理的意图,特别是在您自己的名称空间(com.mycompany.myapp.action.do_SOMETHING或其他)中定义一个操作名称。然后,您可以创建一个与组件匹配的意图,并使用Intent.toUri()获取该组件的URI表示形式。这可以放在你的链接中,当按下时,会寻找一些可以处理的东西,从而找到你的应用程序。注意:要像这样从浏览器启动,组件必须处理可浏览类别。(您不需要在链接中添加此内容,浏览器将自动为您添加此内容。) 最后,您可能希望使用以下命令将intent软件包设置到您的应用程序: 这是平台中较新的功能,允许您将链接意图仅指向您的应用程序,以便其他应用程序无法拦截和处理它们
总而言之:阅读关于意图和意图过滤器的常规文档(例如记事本教程,尽管这里您不会使用content:uri,可能只是自定义操作),让您的应用程序以这种方式工作。然后,您可以创建浏览器链接,以相同的方式启动应用程序,前提是您的意图过滤器处理可浏览类别。首先,要能够从浏览器/邮件中带有自定义方案“myapp”的链接启动应用程序, 按如下所示设置意图过滤器
<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"/>
</intent-filter>
[编辑]
如果使用自定义方案启动应用程序,其中一个问题是:
其他应用程序中的WebView可能无法理解您的自定义方案。
这可能会导致这些浏览器显示404页面,用于自定义方案的链接。这是我的切题贡献 在要加载到清单中的活动中创建意图筛选器,如下所示:
<intent-filter>
<action android:name="com.bubblebeats.MY_CUSTOM_ACTION" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end
<body>
<a href="intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end">click to load apk</a>
</body>
Intent i = new Intent();
i.setAction("com.bubblebeats.MY_CUSTOM_ACTION");
i.putExtra("some_variable", "123456");
Log.d("ezpz", i.toUri(Intent.URI_INTENT_SCHEME));
从浏览器启动apk的最基本HTML代码如下所示:
<intent-filter>
<action android:name="com.bubblebeats.MY_CUSTOM_ACTION" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end
<body>
<a href="intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end">click to load apk</a>
</body>
Intent i = new Intent();
i.setAction("com.bubblebeats.MY_CUSTOM_ACTION");
i.putExtra("some_variable", "123456");
Log.d("ezpz", i.toUri(Intent.URI_INTENT_SCHEME));
这将产生以下结果:
04-13 09:47:30.742: DEBUG/ezpz(9098): intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end
您只需要此部分:
intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end
S.some_variable=123456
仔细看看这里发生了什么,您可以看到如何跳过代码步骤,自己手动创建这些URI
特别是这一部分:
intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end
S.some_variable=123456
因为hackbod从来没有给过我们代码示例,所以我只想在我完成这项工作后与大家分享我的代码示例 首先,您需要在清单文件中定义自定义操作:
<activity
android:name=".activity.MainActivity"
android:label="@string/app_name_full">
<intent-filter>
<action android:name="com.yourpackage.action.OPEN_VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="android.intent.category.BROWSABLE"></category>
</intent-filter>
</activity>
要接收额外任务,请在您的活动中放入以下能够接收自定义操作(如清单中所定义)的内容:
在您的网站上(这是以前生成的链接):
希望这能帮助别人更好的理解。如果我做错了,请纠正我。起初我以为你没有解释忽略URI的标准规则是多么糟糕,但后来我发现了你的错误。@hackbod:就像Casebash一样,我对你的说明有问题。给定一个活动,我转储
getIntent().toUri(Intent.URI\u Intent\u SCHEME).toString()
,将其粘贴到网页(),尝试在模拟器的浏览器中打开它,然后我可以选择在浏览器、联系人或电话中打开该页面,但不能选择我的活动。这似乎很奇怪,考虑到intent:
URI fromtoUri()
中有component
子句,所以我不确定其他应用程序如何获得它。我在意向过滤器上有可浏览的
类别。如果你有什么想法,请给我回电话。谢谢如果您想让URI可靠地工作,就不要尝试这种方法;使用意图URI需要使用URI的应用程序的合作。zxing(条形码扫描器)不接受它们(显然是经过深思熟虑的设计决定),所以如果你想扫描条形码与你的应用程序对话(或者从你无法完全控制的任何其他方法获取URI输入),你要么需要重载http://(这需要用户在浏览器和应用程序之间进行选择)或者只使用一个自定义方案,据我所知,该方案可以透明地进入系统,不会在任何地方出现。)@hackbod你能告诉我w3c文档中建议不要实现新的URI方案吗?我只找到了rfc2718,它似乎支持这一点。@hackbod-但这似乎不适用于iOS。注册一个独特的方案似乎是最跨平台兼容的实现,尽管我同意你的观点,它污染了名称空间。。。这很可能是重复的,在我在这里看到的第一个示例中,这个问题有一个很好的答案,其中包括如何在活动中再次获取Uri。。谢谢处理意图的代码应在何处编码?@sampleio:在应用程序的主要活动中,在onCreate中method@Proverbio在“活动”的onCreate中,您在其中注册了意图过滤器。它当然不一定是主要活动包(从intent.setPackage(..)
序列化到什么?看起来包被附加为package=com.bubblebeats;
(虽然在本例中不明显,但包是URI编码的)@Jason,你能让它工作吗?通过“adb shell am start'intent:#intent…”对我来说很有用。但是,在浏览器中,单击linnk intent不会触发