2011-02-25 85 views
11

我有一种情况,我希望将一些数据从移动网站传递到原生Android应用程序。一个复杂的情况是,在正常情况下,移动网站加载时可能不会安装原生Android应用程序。有没有办法将消息从Android浏览器传递给应用程序?

下面是一个例子:

我ExampleApp中的一个用户,我想与你分享从ExampleApp中的数据,从来没有谁安装ExampleApp中的特定部分。

我向您发送一封电子邮件,其中包含指向移动网页的链接,该链接用于了解打开链接时要查看哪些数据。但是,由于数据只在本机应用程序中提供,而不是在移动网络中提供,因此您会转到要求您前往Android电子市场并安装ExampleApp的页面。

您安装了ExampleApp,理想情况下,您将直接转到与我共享的那条数据。

最大的问题是查看移动网页与安装ExampleApp之间的断开。

我已经想过了几个解决方案,但也获得了成功(这么说,我可能只是被错误地执行这些):

  1. 坐落在我们的域中的Cookie,包括数据,当移动网页被加载。然后,打开ExampleApp时,启动WebView以在同一个域上请求页面并检查cookie的值。使用它来确定在ExampleApp中显示哪些数据。
  2. 使用JavaScript localStorage存储对该数据段的引用,并使用WebView在该域上获取页面并从ExampleApp请求localStorage的内容。

在这两种情况下,似乎WebView和浏览器都是彼此远离的沙箱,所以您无法获取两者之间的cookies/localStorage。

有没有其他方法可以“留下碎屑”或设置一条消息,指稍后安装的应用程序可以从浏览器访问?

编辑:鉴于一些回复,我应该提到,我只希望你点击链接一次,不必点击一次,安装应用程序,然后再次点击打开应用程序到正确的地方。

+0

我很害怕,从我的浏览器中得到信息的应用程序。看起来像我购买的“酷游戏”将由市场营销公司支付,只需耕种数据。我当然希望你不能这样做! – corsiKa 2011-02-25 23:49:43

回答

0

使用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> 
+0

对不起,我想我的问题应该已经更清楚了。这个想法是让人们安装应用程序,因为这是他们可以看到内容的唯一方式。 因此它是:移动网页=>存储数据=>用户安装应用程序=>用户打开应用程序=>应用程序检索数据=>应用程序直接打开检索到的内容 – iseff 2011-02-26 00:11:54

+1

啊,这有点清晰。我不认为这是可能的,无论如何这不是预期的行为,用户将会回到他们在安装应用程序后发送的链接的想法。 – fredley 2011-02-26 00:13:12

4

是否有任何其他的方式来“留下带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电子市场之前在您的网站上创建一个帐户。将数据存储在该帐户下,当它们从应用程序连接回该帐户时,您可以将数据与应用程序进行匹配。

+0

这也是基于用户的两次点击来实现的。我希望能够通过点击他们收到的URL来减少这一点。然后,我们可以轻松地通过安装过程移动它们,并且可以立即查看数据。关于这个的想法? – iseff 2011-02-26 00:22:07

+0

@iseff:“这也是基于用户点击两次以实现目标。” - 无论你如何实现它,它都会是两次以上的点击。你有没有在Android上安装过应用程序?市场中会有2-3次点击,并使用通知来启动应用程序,而不管市场之前或应用程序内的点击次数如何。顺便说一句,我添加了一些更多的笔记给我的答案。 – CommonsWare 2011-02-26 00:51:51

+0

当然,这将是两次以上的完整点击;我的意思是在* original *链接上点击两次(点击一次,发送到“下载应用程序”页面,安装应用程序,再次点击,发送到应用程序)。我正在寻找无缝流动。我们当然想到注册过程,但再次,减少摩擦更好。就箭头之间的“天/小时/月”延迟而言,我们可以通过与市场的链接进行数据存储来最小化,然后在大多数情况下,它会非常快。显然有很多方法可以解决这个问题,但我正在寻找最少的摩擦。 – iseff 2011-02-26 01:17:38

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> 

BTW ,我已决定对此问题blog

+0

你通过了这个测试吗?在原始问题中,iseff引用他的Cookies为不工作(沙箱环境),所以我想知道您是否能够从App中的浏览器访问Cookie TestCookie。谢谢 – DougA 2012-03-16 14:22:35

+1

当然,我测试过它的工作原理!请注意,设置cookie并检索它的网站然后启动定制意图,始终在股票Android浏览器中打开,而不是在WebView中打开。因此,cookie将可用。 – Florian 2012-03-19 08:22:56

+1

太棒了!你提到“股票浏览器”,但非股票浏览器如Firefox或SkyFire呢?我希望它适用于所有浏览器,而不仅仅是默认。 (如果你可以成为一个亲爱的人,并且测试这些......这对我肯定会有帮助的人很有帮助!) – DougA 2012-03-19 12:13:05

0

见:用户点击该链接并安装你的广播接收器将接收广播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_pa​​rameter”值的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

+0

推荐人看起来不可靠,并且在某些设备上不起作用。诸如“Google Play推荐人测试”和“安装推荐人测试”之类的市场应用不会在我的Galaxy S III上显示推荐人。 – 2013-07-01 14:47:57

相关问题