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

Rel*_*lla 52 java browser android

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

 <a href="myapp://mysettings">Foo</a> 
Run Code Online (Sandbox Code Playgroud)

我的应用程序将弹出并使用该URL中发送的参数运行.

那我该怎么做呢?

我需要一个代码教程!

9re*_*9re 55

首先,为了能够通过浏览器/邮件中的自定义方案'myapp'链接启动您的应用程序,请按如下方式设置intent过滤器.

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

并解析你的链接中的查询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
}
Run Code Online (Sandbox Code Playgroud)

[编辑]如果您使用自定义方案启动您的应用程序,其中一个问题是:其他应用程序中的WebView可能无法理解您的自定义方案.这可能会导致显示404页面的浏览器与自定义方案的链接.

  • 我在这里看到的第一个例子包括如何在活动中再次获得Uri ..谢谢! (2认同)
  • @Proverbio 在您注册意图过滤器的活动的 onCreate 中。这当然不一定是主要活动 (2认同)

hac*_*bod 48

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

Android定义了用于描述通用Intent的Uri语法.Intent上有一些方法可以转换为此表示形式,例如:http://developer.android.com/reference/android/content/Intent.html#toUri(int)

因此,执行此操作的方法是使用常规工具在清单中描述您要使用特定组件处理的意图类型,尤其是在您自己的命名空间中定义操作名称(com.mycompany.myapp.action) .DO_SOMETHING或其他).然后,您可以创建与您的组件匹配的Intent,并使用Intent.toUri()来获取此URI的表示形式.这可以放在您的链接中,然后在按下时查找处理的内容,从而找到您的应用程序.注意要像这样从浏览器启动,组件必须处理BROWSABLE类别.(您不需要在链接中放入Intent,浏览器会自动为您添加此内容.)

最后,您可能希望使用以下内容为应用程序设置intent的包:http://developer.android.com/reference/android/content/Intent.html#setPackage(java.lang.String)

这是平台中的一个较新功能,它允许您将链接意图仅指向您的应用程序,以便其他应用程序无法拦截和处理它们.

总结:阅读关于意图和意图过滤器的常规文档(例如NotePad教程,虽然你不会在这里使用内容:URI,可能只是自定义操作)并让你的应用程序以这种方式工作.然后,您可以创建浏览器链接以相同的方式启动您的应用程序,前提是您的intent-filter处理BROWSABLE类别.

  • @hackbod你能指点一下w3c文档,建议不实现新的URI方案吗?我只发现rfc2718似乎支持这一点. (4认同)
  • @hackbod - 看起来这不适用于iOS.似乎注册一个独特的方案是最跨平台兼容的实现,虽然我同意你的意见,它污染了命名空间... https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter -AppCommunication /间AppCommunication.html#// apple_ref/DOC/UID/TP40007072-CH6-SW1 (3认同)
  • 起初我以为您没有解释忽略URI的标准规则是多么糟糕,但是后来我发现了[这里的其他答案](http://stackoverflow.com/questions/2448213/how-to-implement-my -very-own-uri-schema-on-android / 2449500#2449500)。 (2认同)
  • @hackbod:像Casebash一样,我的指示有问题.给定一个活动,我转储`getIntent().toUri(Intent.URI_INTENT_SCHEME).toString()`,将其粘贴到网页(http://commonsware.com/sample)中,尝试在模拟器上的浏览器中打开它,我可以选择在浏览器,通讯录或电话中打开页面,但不能选择我的活动.这看起来很奇怪,考虑到来自`toUri()`的`intent:`URI有`component`子句,所以我不确定其他应用程序是如何得到它的.我在intent过滤器上有`BROWSABLE`类别.如果您有任何想法,请@我回来.谢谢! (2认同)
  • 如果您希望URI可靠地工作,请不要尝试使用此方法。使用意图URI要求应用采用URI的合作。zxing(条形码扫描仪)不接受它们(显然是经过深思熟虑的设计决定),因此,如果您希望能够扫描条形码以与您的应用对话(或从您无法完全控制的任何其他方法获取URI输入) ,您要么需要重载http://(这需要用户在浏览器和您的应用之间进行选择),要么只是采用自定义方案,据我所知,它可以透明地将通行证传递到系统中,并且不会在任何地方被捕获)。 (2认同)

Jas*_*den 44

这是我对追逐贡献的切入.

在要在清单中加载的活动中创建一个intent过滤器,如下所示:

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

您的网页网址如下所示:

intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end
Run Code Online (Sandbox Code Playgroud)

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

<body>
    <a href="intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;end">click to load apk</a>
</body>
Run Code Online (Sandbox Code Playgroud)

向您的意图添加变量

您可以在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));
Run Code Online (Sandbox Code Playgroud)

这会产生这个:

04-13 09:47:30.742: DEBUG/ezpz(9098): intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end
Run Code Online (Sandbox Code Playgroud)

你只想要这个部分:

intent:#Intent;action=com.bubblebeats.MY_CUSTOM_ACTION;S.some_variable=123456;end
Run Code Online (Sandbox Code Playgroud)

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

特别是这部分:

S.some_variable=123456
Run Code Online (Sandbox Code Playgroud)

  • @Jason,你能让这个工作吗?通过"adb shell am start"意图启动意图:#Intent ..."对我有用.但是,从浏览器中,单击linnk意图不会触发应用程序启动. (3认同)

Alb*_*tNf 9

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

然后,对于您网站上的内容,您需要从intent生成URI.将以下代码放入您的Activity中(生成链接后,可以删除此代码):

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

要接收额外内容,请将以下内容放入您的活动中,以便能够接收自定义操作(如清单中所定义):

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

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

<a href="intent:#Intent;action=com.yourpackage.action.OPEN_VIEW;package=com.yourpackage;S.myextra=anystring;end">Open App with extra</a>
Run Code Online (Sandbox Code Playgroud)

希望能帮助别人更好地理解.如果我出错了,请纠正我.