有没有办法将消息从Android浏览器传递到应用程序?

时间:2011-02-25 23:45:58

标签: android html5 webview

我有一种情况,我希望将某些数据从移动网站传递到原生Android应用。一个复杂的问题是,在正常情况下,加载移动网站时可能不会安装原生Android应用程序。

以下是一个例子:

我是ExampleApp的用户,我想与您分享来自ExampleApp的特定数据,而您从未安装过ExampleApp。

我向您发送一封电子邮件,其中包含指向移动网页的链接,该网页会在您打开链接时知道您想要查看哪些数据。但是,由于数据仅在本机应用程序中可用,而不是移动网络,因此您将进入一个页面,要求您转到Android Market并安装ExampleApp。

您安装了ExampleApp,理想情况下,您将直接访问我与您共享的数据。

最大的问题在于查看移动网页与安装ExampleApp之间的脱节。

我考虑了几个解决方案,但都没有成功(也就是说,我可能只是错误地实现了它们):

  1. 在我们的域中设置一个cookie,其中包含加载移动网页时的数据。然后,当打开ExampleApp时,启动WebView以请求同一域上的页面并检查cookie的值。用它来确定要在ExampleApp中显示哪些数据。
  2. 使用JavaScript localStorage存储对该数据的引用,并使用WebView获取该域上的页面,并从ExampleApp中请求localStorage的内容。
  3. 在这两种情况下,似乎WebView和浏览器都是相互远离的沙盒,所以你无法获得两者之间的cookies / localStorage。

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

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

4 个答案:

答案 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_pa​​rameter”值的广播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