我有一种情况,我希望将某些数据从移动网站传递到原生Android应用。一个复杂的问题是,在正常情况下,加载移动网站时可能不会安装原生Android应用程序。
以下是一个例子:
我是ExampleApp的用户,我想与您分享来自ExampleApp的特定数据,而您从未安装过ExampleApp。
我向您发送一封电子邮件,其中包含指向移动网页的链接,该网页会在您打开链接时知道您想要查看哪些数据。但是,由于数据仅在本机应用程序中可用,而不是移动网络,因此您将进入一个页面,要求您转到Android Market并安装ExampleApp。
您安装了ExampleApp,理想情况下,您将直接访问我与您共享的数据。
最大的问题在于查看移动网页与安装ExampleApp之间的脱节。
我考虑了几个解决方案,但都没有成功(也就是说,我可能只是错误地实现了它们):
在这两种情况下,似乎WebView和浏览器都是相互远离的沙盒,所以你无法获得两者之间的cookies / localStorage。
有没有其他方法可以“留下一个crumbtrail”或设置一条消息,以后安装的应用可以从浏览器访问?
编辑:鉴于一些回复,我应该提到我只希望你点击链接一次,不必点击一次,安装应用程序,然后再次点击打开应用程序到正确的位置。答案 0 :(得分:10)
解决方案实际上非常简单,我有点惊讶,没有人能够提出它超过一年。所以这就是:
基本思想是使用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>
顺便说一句,我已经决定blog关于这个问题。
答案 1 :(得分:4)
还有其他方式可以留下一个小小的东西&#34;或者设置以后安装的应用可以从浏览器访问的消息?
我认为有一个更简单的解决方案,即条形码扫描仪所采用的解决方案。
步骤1:创建一个包含所需信息的漂亮RESTful URL。通过RESTful,我的意思是没有?
,没有#
,没有任何废话。如果这是一个不同的域名,它会变得更简单,但这可能只是你现有域名的东西。出于本答案的目的,我将假设此网址看起来像http://android.exampleapp.com/our/custom/data/goes/in/here/somewhere
。
步骤2:对于可以按照步骤#1的模式(http://android.exampleapp.com
中的任何内容)创建的所有URL,您的Web服务器应该提供一个页面,说&#34;嘿!你没有安装ExampleApp!如果您在此处单击此链接,它将带您进入Android Market,您可以在其中安装ExampleApp!然后,尝试点击将您带到此页面的链接,它将启动ExampleApp并为您提供...嗯......所有这些良好的数据&#34;。
步骤3:在ExampleApp中实施一项活动,其中<intent-filter>
具有VIEW
操作,BROWSEABLE
类别和<data>
元素,用于标识您的方案和域(如果需要,还可以使用基本路径,如果所有这些链接都相同的话)。
用户看到的内容,如果他们没有安装ExampleApp并单击该链接,则是您从步骤2开始的Web页面,他们可以从中安装ExampleApp。
用户看到的内容,如果他们安装了ExampleApp并点击了链接,则是您的活动,可以通过getIntent().getData()
获取网址并执行有用的操作。
<强>更新强>
在评论中,您写道:
恕我直言,你对用户将要做的事做出太多假设。我以粗体显示的箭头之间可能有数天,数周或数月的延迟。移动网页=&gt;商店数据 =&gt; 用户安装应用 =&gt; 用户打开app =&gt; app检索数据=&gt;应用程序直接打开检索到的内容
如果您要自己分发(例如,从您的Web服务器上),您总是可以选择&#34;刻录&#34;他们是一个自定义APK,里面有数据,但是你必须自己处理管理更新。
或者,如果您使用的是基于帐户的系统,请让他们在您的网站上创建一个帐户,然后再将其发送到Android电子市场。将数据存储在该帐户下,当他们从应用程序连接回该帐户时,您可以将数据与应用匹配。
答案 2 :(得分:0)
使用GET参数:http://exampleapps.com?token=mK7Fyt5想一想YouTube应用的工作方式。您已被发送到视频的链接。如果您没有YouTube应用,则会看到移动网站(在您的情况下可能是安装链接)。如果这样做,系统会询问您是否使用本机应用打开YouTube链接,并且本机应用程序会传递调用它的URL,从中可以解析要显示的视频的参数。
使用以下intent过滤器:
<intent-filter>
<data android:scheme="http" android:host="exampleapps.com"/>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
答案 3 :(得分:0)
请参阅:https://stackoverflow.com/a/7577379/710284
您可以使用INSTALL_REFERRER链接,例如:
http://market.android.com/details?id=your.package.name&referrer=your_wanted_parameter
用户点击此链接并安装应用程序后,您的广播接收器将收到带有“your_wanted_parameter”值的广播com.android.vending.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