ise*_*eff 11 html5 android webview
我有一种情况,我希望将一些数据从移动网站传递到原生Android应用程序.一个复杂的问题是,在正常情况下,加载移动网站时可能不会安装原生Android应用程序.
这是一个例子:
我是ExampleApp的用户,我希望与您共享来自ExampleApp的特定数据,而您从未安装过ExampleApp.
我发送了一封电子邮件,其中包含指向移动网页的链接,该网页知道您打开链接时要查看的数据.但是,由于数据仅在本机应用程序中可用,而不是移动网络,因此您将进入一个页面,要求您转到Android Market并安装ExampleApp.
您安装了ExampleApp,理想情况下,您将直接访问我与您共享的数据.
最大的问题是查看移动网页和安装ExampleApp之间的脱节.
我已经考虑了几个解决方案,但都没有成功(说,我可能只是错误地实现它们):
在这两种情况下,似乎WebView和浏览器都是相互远离的沙箱,因此您无法获得两者之间的cookies/localStorage.
有没有其他方法可以"留下一个crumbtrail"或设置一条消息,以后安装的应用程序可以从浏览器访问?
编辑:鉴于一些回复,我应该提到我只希望你点击链接一次,不必点击一次,安装应用程序,然后再次点击打开应用程序到正确的地方.
Flo*_*ian 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 ...
}
Run Code Online (Sandbox Code Playgroud)
一个简单的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;
}
?>
Run Code Online (Sandbox Code Playgroud)
并且意图过滤器:
<!-- 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>
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我已决定在博客上发表这个问题.
使用 GET 参数:http://exampleapps.com?token=mK7Fyt5想想 YouTube 应用程序的工作方式。您将被转到视频链接。如果您没有 YouTube 应用,您会看到移动网站(在您的情况下可能是安装链接)。如果这样做,系统会询问您是否使用本机应用程序打开 YouTube 链接,并向本机应用程序传递调用它的 URL,它可以从中解析出要显示的视频的参数。
使用以下意图过滤器:
<intent-filter>
<data android:scheme="http" android:host="exampleapps.com"/>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6230 次 |
| 最近记录: |