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

所以我想创build一个Android应用程序,以便在Android操作系统中进行注册(或者只是在系统启动时启动),当手机用户在网页浏览器内点击网页上的特殊button时:

<a href="myapp://mysettings">Foo</a> 

我的应用程序会popup并运行使用该URL中发送的参数。

那么我该如何做这样的事情呢?

我需要一个带有代码的教程!

你需要通过W3C遵循URI的标准规则,这基本上意味着:不要这样做。

Android定义了一个Uri语法来描述一个通用的Intent。 有意图转换为和从这种表示,例如: http : //developer.android.com/reference/android/content/Intent.html#toUri(int)

所以这样做的方法是使用正常的工具在你的清单中描述你将要使用特定组件处理的意图types,特别是在你自己的命名空间中定义一个动作名称(com.mycompany.myapp.action .DO_SOMETHING或其他)。 然后,您可以创build一个与您的组件匹配的Intent,并使用Intent.toUri()来获取这个URI的表示forms。 这可以放在你的链接,然后当按下时寻找处理,从而find你的应用程序。 注意从这样的浏览器启动,组件必须处理BROWSABLE类别。 (你不需要在链接中join这个Intent,浏览器会自动为你添加这个)。

最后,您可能需要使用以下命令将意向包设置为您的应用程序: http : //developer.android.com/reference/android/content/Intent.html#setPackage(java.lang.String)

这是该平台的一个新function,它允许您将链接意图指向只有您的应用程序,以便其他应用程序不能拦截和处理它们。

总结:阅读有关意图和意图filter的常规文档(例如NotePad教程,尽pipe您不会在这里使用content:URI,可能只是自定义操作),并让您的应用程序以这种方式工作。 然后,您可以使用浏览器链接以相同的方式启动您的应用程序,前提是您的意图filter处理了BROWSABLE类别。

首先,为了能够通过浏览器/邮件中的自定义scheme“myapp”的链接启动您的应用程序,请按如下所示设置意向filter。

 <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> 

并parsing链接中的查询myapp:// someaction /?var = str&varr = string
(代码过于简化,没有错误检查。)

 Intent intent = getIntent(); // check if this intent is started via custom scheme link if (Intent.ACTION_VIEW.equals(intent.getAction())) { Uri uri = intent.getData(); // may be some test here with your custom uri String var = uri.getQueryParameter("var"); // "str" is set String varr = uri.getQueryParameter("varr"); // "string" is set } 

如果您使用自定义scheme启动您的应用程序,其中一个问题是:其他应用程序中的WebView可能不理解您的自定义scheme。 这可能导致显示404页面的这些浏览器与自定义scheme的链接。

这是我对裁员的贡献。

在你要在清单中加载的活动中创build一个意图filter,如下所示:

 <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> 

您的网页url如下所示:

 intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end 

从浏览器启动apk的最基本的HTML代码如下所示:

 <body> <a href="intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end">click to load apk</a> </body> 

为您的意图添加variables

你可以像这样在你的Android代码中生成URI:

 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 

仔细看一下这里发生的事情,你可以看到如何跳过代码步骤,并自己手动创build这些URI。

尤其是这部分:

 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。 将下面的代码放入您的活动中(一旦链接生成,此代码可以被删除):

 Intent i = new Intent(); i.setAction("com.yourpackage.action.OPEN_VIEW"); i.setPackage("com.yourpackage"); i.putExtra("myextra","anystring"); Log.d(getClass().getSimpleName(), i.toUri(Intent.URI_INTENT_SCHEME)); 

要接收Extras,请在您的活动中添加以下内容,以便能够接收自定义操作(如清单中所定义):

 final Intent intent = getIntent(); final String action = intent.getAction(); if ("com.yourpackage.action.OPEN_VIEW".equals(action)) { Log.i(getClass().getSimpleName(), "EXTRA: "+intent.getExtras().getString("myextra")); } 

在您的网站上(这是以前生成的链接):

 <a href="intent:#Intent;action=com.yourpackage.action.OPEN_VIEW;package=com.yourpackage;S.myextra=anystring;end">Open App with extra</a> 

希望能帮助别人更好的理解。 如果我弄错了,请纠正我。