从 android 浏览器启动自定义 android 应用程序
Posted
技术标签:
【中文标题】从 android 浏览器启动自定义 android 应用程序【英文标题】:Launch custom android application from android browser 【发布时间】:2011-02-26 20:56:23 【问题描述】:谁能指导我如何从安卓浏览器启动我的安卓应用程序?
【问题讨论】:
【参考方案1】:例如,你有接下来的事情:
打开您的应用的链接:http://example.com
你的应用的包名:com.example.mypackage
那你需要做下一步:
为您的活动添加一个意图过滤器 (可以是您想要的任何活动。有关更多信息,请查看documentation)。
<activity
android:name=".MainActivity">
<intent-filter android:label="@string/filter_title_view_app_from_web">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "http://example.com" -->
<data
android:host="example.com"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
创建一个 html 文件来测试链接或使用this methods.
直接打开您的活动(只需打开您的活动,无需选择对话框)。
Open this link with browser or your programm (by choosing dialog).
使用移动版 Chrome 进行测试
就是这样。
而且没有必要在市场上发布应用来测试深度链接 =)
另外,有关更多信息,请查看documentation 和有用的presentation。
【讨论】:
我必须创建 html 文件并上传它才能使其正常工作。我想知道为什么,尤其是第二个,不能直接从浏览器(chrome)工作。 如何通过此链接向应用发送数据?【参考方案2】:Xamarin 移植 Felix 的答案
在您的 MainActivity
中,添加以下内容(文档:Android.App.IntentFilterAttribute Class):
....
[IntentFilter(new[]
Intent.ActionView ,
Categories = new[] Intent.CategoryDefault, Intent.CategoryBrowsable ,
DataScheme = "my.special.scheme")
]
public class MainActivity : Activity
....
Xamarin 将在 AndroidManifest.xml
中为您添加以下内容:
<activity
android:label="Something"
android:screenOrientation="portrait"
android:theme="@style/MyTheme"
android:name="blah.MainActivity">
<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="my.special.scheme" />
</intent-filter>
</activity>
为了获取参数(我在 MainActivity 的 OnCreate 中测试过):
var data = Intent.Data;
if (data != null)
var scheme = data.Scheme;
var host = data.Host;
var args = data.PathSegments;
if (args.Count > 0)
var first = args[0];
var second = args[1];
...
据我所知,上面可以添加到任何activity中,不仅仅是MainActivity
注意事项:
-
当用户点击链接时,Android 操作系统会重新启动您的应用程序(如果有的话,杀死 prev 实例并运行新的实例),这意味着应用程序的
MainLauncher Activity
的 OnCreate
事件将被触发再次。
使用此链接:<a href="my.special.scheme://host/arg1/arg2">
,在上面 last 代码中,sn-p 值将是:
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2
更新:如果 android 为您的应用创建新实例,您也应该添加 android:launchMode="singleTask"
。
【讨论】:
【参考方案3】:截至 2014 年 1 月 28 日,以上所有答案都不适用于 CHROME
我的应用从 http://example.com/someresource/ 链接正确启动,来自环聊、gmail 等应用的链接,但不是从 chrome 浏览器中启动。
要解决这个问题,以便它从 CHROME 正确启动,您必须像这样设置意图过滤器
<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:host="example.com"
android:pathPrefix="/someresource/"
android:scheme="http" />
<data
android:host="www.example.com"
android:pathPrefix="/someresource/"
android:scheme="http" />
</intent-filter>
注意pathPrefix
元素
现在,只要用户通过点击 google 搜索结果或任何其他网站的链接从 chrome 浏览器请求 http://example.com/someresource/ 模式,您的应用就会出现在活动选择器中
【讨论】:
这对我帮助很大。非常感谢!请在此处发布您的答案,以便我奖励您赏金! ***.com/questions/21663001/… 这是什么语言? 你好,我知道它太旧了。我也在同样的情况下感到震惊。我已经指定了 pathPrefix、scheme 和 host,但它不起作用。我只尝试了方案,然后它起作用了。但是当我添加主机时,它停止工作。知道可能是什么问题吗? 花了几天的时间才得到这个答案。在没有 pathPrefix 元素的情况下,不确定它对整个世界的工作方式。尽管按照文档做了所有事情,但从未在 chrome 上为我工作过。非常感谢。【参考方案4】:截至 2019 年 6 月 15 日
我所做的是包括所有四种打开 url 的可能性。
即,http
/ https
和 2 带有 www
前缀和 2 不带 www
通过使用它,我的应用程序现在会自动启动,而无需我选择浏览器和其他选项。
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="example.in" />
<data android:scheme="https" android:host="www.example.in" />
<data android:scheme="http" android:host="example.in" />
<data android:scheme="http" android:host="www.example.in" />
</intent-filter>
【讨论】:
【参考方案5】:在here 中查看@JRuns 的答案。这个想法是使用您的自定义方案创建 html 并将其上传到某处。然后,如果您单击 html 文件上的自定义链接,您将被重定向到您的应用程序。我用this 文章为android。但不要忘记为您的目标活动设置全名Name = "MyApp.Mobile.Droid.MainActivity"
属性。
【讨论】:
【参考方案6】:example.php:
<?php
if(!isset($_GET['app_link'])) ?>
<iframe src="example.php?app_link=YourApp://blabla" style="display:none;" scrolling="no" frameborder="0"></iframe>
<iframe src="example.php?full_link=http://play.google.com/xyz" style="display:none;" scrolling="no" frameborder="0"></iframe>
<?php
else ?>
<script type="text/javascript">
self.window.location = '<?php echo $_GET['app_link'];?>';
window.parent.location.href = '<?php echo $_GET['full_link'];?>';
</script>
<?php
【讨论】:
这会创建两个不可见的 iframe:深层链接和普通链接。如果应用程序已安装,深层链接 iframe 将启动它。如果不是,则显示正常链接。通过一些额外的工作,可以在安装应用程序后调用深层链接的地方实现延迟深层链接。【参考方案7】:Felix 处理深层链接的方法是处理深层链接的典型方法。我还建议查看这个库来处理您的深层链接的路由和解析:
https://github.com/airbnb/DeepLinkDispatch
您可以使用注释为特定的深度链接 URI 注册您的 Activity,它会为您提取参数,而无需执行获取路径段、匹配它等通常的繁琐操作。您可以简单地注释和像这样的活动:
@DeepLink("somePath/someParameter1/someParameter2")
public class MainActivity extends Activity
...
【讨论】:
【参考方案8】:以下链接提供了有关直接从浏览器启动应用程序(如果已安装)的信息。否则直接在play store打开应用,方便用户无缝下载。
https://developer.chrome.com/multidevice/android/intents
【讨论】:
【参考方案9】:请注意,当您实现此功能时,如果您的图标从 android 启动器中消失,则您必须拆分意图过滤器。
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-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="your-own-uri" />
</intent-filter>
</activity>
【讨论】:
【参考方案10】:是的,Chrome 搜索而不是寻找方案。如果您想通过 URI 方案启动您的应用程序,请在 Play 商店中使用这个很酷的实用程序应用程序。它拯救了我的一天:) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender
【讨论】:
【参考方案11】:请在此处查看我的评论:Make a link in the Android browser start up my app?
我们强烈劝阻人们不要使用他们自己的方案,除非他们正在定义一个新的全球互联网方案。
【讨论】:
Hackbod 是 Android 平台背后的 Google 工程师之一。遵循这个建议可能是个好主意。事实上,像这样的自定义方案支持似乎在 Honeycomb 中中断了。 我不对 ios 对开发者施加的限制负责。 ;) 对此负责?不。但是您可以考虑到这一点,因为无论您喜不喜欢,这些限制都会强加给您的许多开发人员 hackbod 正在回答一个专门针对 Android 的问题。没有提到 iOS,所以不需要考虑它。 @hackbod 将方案命名空间(即 href="com.ourdomain.myapp//whatever")是一个好习惯,假设可以在不同的网站上找到这样的链接?【参考方案12】:就我而言,我必须为<intent-filter>
设置两个类别,然后它就起作用了:
<intent-filter>
<data android:scheme="my.special.scheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
【讨论】:
这里一样,需要添加额外的类别。 有人能解释一下完成这项工作的实际过程是什么吗?任何指向确切实施的链接,先决条件都会有所帮助。谢谢 在开发设置上测试。其实我给了一个错误的域名。我的错。 评分最高的答案对我不起作用,但确实如此。谢谢。 什么是服务器端的 href 链接?【参考方案13】:还应该在意图过滤器中添加<category android:name="android.intent.category.BROWSABLE"/>
,以使活动从链接中正确识别。
【讨论】:
作为参考,添加 CATEGORY_BROWSABLE 意味着“浏览器可以安全地调用目标 Activity 以显示链接引用的数据——例如,图像或电子邮件消息。” 这是一个现有的类别还是您正在提议一个新的类别? 它存在。显然,您应该在不同的意图过滤器标签中拥有单独的网站主机,否则会导致问题。 不只是 BROWSABLE,还有 android.intent.category.DEFAULT - 所以链接可以在其他应用程序中打开,比如电子邮件(不仅仅是浏览器)【参考方案14】:您需要在 CALLBACK_URL 中添加一个伪主机名“app://”作为 URL 没有意义,无法解析。
【讨论】:
【参考方案15】:嘿,我找到了解决方案。我没有将类别设置为“默认”。我也将主要活动用于意图数据。现在我对意图数据使用不同的活动。谢谢您的帮助。 :)
【讨论】:
听起来不太可能(尽管我认识到这是一个老问题,也许事情已经改变了。)来自developer.android.com/guide/components/intents-filters.html#ifs“为了通过类别测试,Intent 对象中的每个类别 必须匹配 filter 中的类别。过滤器可以列出其他类别,但不能省略意图中的任何类别。"【参考方案16】:使用<intent-filter>
和<data>
元素。例如,要处理所有指向 twitter.com 的链接,您可以将其放在 <activity>
中的 AndroidManifest.xml
中:
<intent-filter>
<data android:scheme="http" android:host="twitter.com"/>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
然后,当用户在浏览器中点击 twitter 链接时,他们将被询问使用哪个应用程序来完成操作:浏览器或您的应用程序。
当然,如果您想在您的网站和应用之间提供紧密集成,您可以定义自己的方案:
<intent-filter>
<data android:scheme="my.special.scheme" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
然后,在您的网络应用程序中,您可以放置如下链接:
<a href="my.special.scheme://other/parameters/here">
当用户点击它时,您的应用程序将自动启动(因为它可能是唯一可以处理 my.special.scheme://
类型的 uris 的应用程序)。唯一的缺点是,如果用户没有安装应用程序,他们会得到一个讨厌的错误。而且我不确定有什么方法可以检查。
编辑:要回答您的问题,您可以使用getIntent().getData()
,它返回一个Uri
对象。然后您可以使用Uri.*
方法来提取您需要的数据。例如,假设用户点击了指向http://twitter.com/status/1234
的链接:
Uri data = getIntent().getData();
String scheme = data.getScheme(); // "http"
String host = data.getHost(); // "twitter.com"
List<String> params = data.getPathSegments();
String first = params.get(0); // "status"
String second = params.get(1); // "1234"
您可以在Activity
中的任何位置执行上述操作,但您可能希望在onCreate()
中执行此操作。您也可以使用params.size()
来获取Uri
中的路径段数。查看 javadoc 或 android 开发者网站,了解可用于提取特定部分的其他 Uri
方法。
【讨论】:
非常感谢您的及时回复。但是你能告诉我如何访问“my.special.scheme://”之后的参数吗? 我已经编辑了我的答案以包含有关如何从 Uri 中提取数据的说明。如果您认为此答案是已接受的,请单击它旁边的复选标记,将其标记为已接受(仅)。 如果目标安卓应用没有安装怎么办?如何处理。 任何像我一样无法让这个方案工作的人,需要在清单中将android:exported="true"
添加到他们的Activity
。检查这个答案***.com/a/13044911/1276636
不确定这对整个世界有什么作用。只是在 chrome 上不起作用,它总是在浏览器中打开链接,直到您放置“android:pathPrefix”元素。无论如何,答案没有文档中提到的类别值。如果它仍然对某人不起作用,请参考:***.com/a/21727055/2695276 PS:为此挣扎了好几天。以上是关于从 android 浏览器启动自定义 android 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
OneSignal - 使用来自 url 的自定义图像从 android 应用发送通知
如何从自定义 Android 应用程序启动 uber eats 应用程序