有没有办法将消息从Android浏览器传递给应用程序?
我有一种情况,我希望将一些数据从移动网站传递到原生Android应用程序。一个复杂的情况是,在正常情况下,移动网站加载时可能不会安装原生Android应用程序。有没有办法将消息从Android浏览器传递给应用程序?
下面是一个例子:
我ExampleApp中的一个用户,我想与你分享从ExampleApp中的数据,从来没有谁安装ExampleApp中的特定部分。
我向您发送一封电子邮件,其中包含指向移动网页的链接,该链接用于了解打开链接时要查看哪些数据。但是,由于数据只在本机应用程序中提供,而不是在移动网络中提供,因此您会转到要求您前往Android电子市场并安装ExampleApp的页面。
您安装了ExampleApp,理想情况下,您将直接转到与我共享的那条数据。
最大的问题是查看移动网页与安装ExampleApp之间的断开。
我已经想过了几个解决方案,但也获得了成功(这么说,我可能只是被错误地执行这些):
- 坐落在我们的域中的Cookie,包括数据,当移动网页被加载。然后,打开ExampleApp时,启动WebView以在同一个域上请求页面并检查cookie的值。使用它来确定在ExampleApp中显示哪些数据。
- 使用JavaScript localStorage存储对该数据段的引用,并使用WebView在该域上获取页面并从ExampleApp请求localStorage的内容。
在这两种情况下,似乎WebView和浏览器都是彼此远离的沙箱,所以您无法获取两者之间的cookies/localStorage。
有没有其他方法可以“留下碎屑”或设置一条消息,指稍后安装的应用程序可以从浏览器访问?
编辑:鉴于一些回复,我应该提到,我只希望你点击链接一次,不必点击一次,安装应用程序,然后再次点击打开应用程序到正确的地方。
使用GET参数:http://exampleapps.com?token=mK7Fyt5想一想YouTube应用程序的工作方式。你被发送到视频链接。如果您没有YouTube应用,则会看到移动网站(您的情况可能是安装链接)。如果这样做,系统会询问是否使用本地应用程序打开YouTube链接,然后本地应用程序会传递调用该URL的URL,从中解析出要显示的视频的参数。
使用以下意图过滤器:
<intent-filter>
<data android:scheme="http" android:host="exampleapps.com"/>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
是否有任何其他的方式来“留下带crumbtrail”或设置后安装的应用可以从浏览器访问的消息?
我认为有一个更简单的解决方案,即条码扫描器所采用的解决方案。
步骤#1:创建一个漂亮的RESTful URL,其中包含所需的信息。通过RESTful我的意思是没有?
,没有#
,没有那个废话。如果这是一个独特的域名,它会更简单,但这可能只是现有域中的某些内容。为了这个答案的目的,我会假设这个URL看起来像http://android.exampleapp.com/our/custom/data/goes/in/here/somewhere
。
步骤#2:对于可以按照步骤1的模式创建的所有URL(http://android.exampleapp.com
中的任何内容),Web服务器应该提供一个页面,上面写着“嗨!您没有安装ExampleApp!点击此链接,它会带你到Android Market,在那里你可以安装ExampleApp!然后,尝试点击将你带到这个页面的链接,它将启动ExampleApp并给你... ummm ...全部这个好数据“。
步骤#3:实施在ExampleApp中的活性,其具有与所述VIEW
动作的<intent-filter>
,所述BROWSEABLE
类别和<data>
元件识别您的方案和结构域(和,如果需要的话,底座的路径,如果这将是所有这些链接都一样)。
如果用户没有安装ExampleApp并单击该链接,则用户看到的是第2步中的Web页面,可以从中安装ExampleApp。
用户看到的内容,如果他们确实安装了ExampleApp并单击该链接,那么您的活动就是通过getIntent().getData()
获取URL并执行一些有用的操作。
UPDATE
在评论,您写道:
移动网页=>存储数据=>用户安装的应用程序=>用户打开应用程序=>应用程序检索数据=>应用程序直接打开检索到的内容
恕我直言,你做了太多关于用户将要做什么的假设。我用粗体显示的箭头之间可能会有几天,几周或几个月的延迟。
如果你打算自己发布它(例如,离开你的Web服务器),你总是可以选择将它们中的数据“烧”成一个自定义的APK,但是你必须处理管理更新你自己。
或者,如果您打算使用基于帐户的系统,请让他们在将您的网站发送到Android电子市场之前在您的网站上创建一个帐户。将数据存储在该帐户下,当它们从应用程序连接回该帐户时,您可以将数据与应用程序进行匹配。
这也是基于用户的两次点击来实现的。我希望能够通过点击他们收到的URL来减少这一点。然后,我们可以轻松地通过安装过程移动它们,并且可以立即查看数据。关于这个的想法? – iseff 2011-02-26 00:22:07
@iseff:“这也是基于用户点击两次以实现目标。” - 无论你如何实现它,它都会是两次以上的点击。你有没有在Android上安装过应用程序?市场中会有2-3次点击,并使用通知来启动应用程序,而不管市场之前或应用程序内的点击次数如何。顺便说一句,我添加了一些更多的笔记给我的答案。 – CommonsWare 2011-02-26 00:51:51
当然,这将是两次以上的完整点击;我的意思是在* original *链接上点击两次(点击一次,发送到“下载应用程序”页面,安装应用程序,再次点击,发送到应用程序)。我正在寻找无缝流动。我们当然想到注册过程,但再次,减少摩擦更好。就箭头之间的“天/小时/月”延迟而言,我们可以通过与市场的链接进行数据存储来最小化,然后在大多数情况下,它会非常快。显然有很多方法可以解决这个问题,但我正在寻找最少的摩擦。 – iseff 2011-02-26 01:17:38
解决方案其实很简单,我有点惊讶,没有人能够提出一年以上。所以这里是:
基本的想法是使用cookie来存储信息。数据流如下:
打开网页 - >设置cookie - >重定向到市场 - >安装应用程序 - >启动浏览器与网页 - >读取cookie - >用cookie数据启动自定义意图 - >捕获意图并读取cookie数据
用户访问网页(例如通过扫描QR码)。该网页的网址拥有对您想要传递的数据的引用,或者保存数据本身。该网站将数据设置为Cookie并重定向到Android市场(http://market.android.com/details?id=com.yourapp)。一旦你的应用程序启动,你打开一个浏览器并再次加载相同的网页。但是,这一次,它检测到Cookie已设置并重定向到自定义URL方案,如example://example.com/installed?id = DATA,而不是市场。使用意图过滤器,您可以启动活动并从意图中提取信息。
下面是相关活动代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if(intent == null || intent.getData() == null || !"example".equals(intent.getData().getScheme())) {
String url = "http://example.com/yourApp/index.php";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
finish();
return;
}else {
Uri uri = intent.getData();
if("example".equals(uri.getScheme())) {
id = uri.getQueryParameter("id");
}
}
... initialise your activity ...
}
一个简单的PHP文件(网页),便于演示:
<?php
$value = "123";
if(!isset($_COOKIE["TestCookie"])) {
setcookie("TestCookie", $value, time()+3600); /* expire in 1 hour */
header("Location: http://market.android.com/details?id=com.yourapp");
exit;
}else {
header("Location: example://example.com/installed?id=".$_COOKIE["TestCookie"]);
exit;
}
?>
而且意图过滤器:
<!-- Handle URLs like loyalty://example.com/merchant/123 -->
<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="example" android:host="example.com" />
</intent-filter>
BTW ,我已决定对此问题blog。
你通过了这个测试吗?在原始问题中,iseff引用他的Cookies为不工作(沙箱环境),所以我想知道您是否能够从App中的浏览器访问Cookie TestCookie。谢谢 – DougA 2012-03-16 14:22:35
当然,我测试过它的工作原理!请注意,设置cookie并检索它的网站然后启动定制意图,始终在股票Android浏览器中打开,而不是在WebView中打开。因此,cookie将可用。 – Florian 2012-03-19 08:22:56
太棒了!你提到“股票浏览器”,但非股票浏览器如Firefox或SkyFire呢?我希望它适用于所有浏览器,而不仅仅是默认。 (如果你可以成为一个亲爱的人,并且测试这些......这对我肯定会有帮助的人很有帮助!) – DougA 2012-03-19 12:13:05
见:用户点击该链接并安装你的广播接收器将接收广播com.android.vending申请后
http://market.android.com/details?id=your.package.name&referrer=your_wanted_parameter
:https://stackoverflow.com/a/7577379/710284
您可以像使用一个INSTALL_REFERRER链接。带有“your_wanted_parameter”值的INSTALL_REFERRER。
更多信息:
http://code.google.com/mobile/analytics/docs/android/#android-market-tracking
Get referrer after installing app from Android Market
Get Android Google Analytics referrer tag
推荐人看起来不可靠,并且在某些设备上不起作用。诸如“Google Play推荐人测试”和“安装推荐人测试”之类的市场应用不会在我的Galaxy S III上显示推荐人。 – 2013-07-01 14:47:57
我很害怕,从我的浏览器中得到信息的应用程序。看起来像我购买的“酷游戏”将由市场营销公司支付,只需耕种数据。我当然希望你不能这样做! – corsiKa 2011-02-25 23:49:43