如何将 Blob 对象从 javascript 传递到 Android?
Posted
技术标签:
【中文标题】如何将 Blob 对象从 javascript 传递到 Android?【英文标题】:How to pass a Blob object from javascript to Android? 【发布时间】:2014-09-01 11:29:19 【问题描述】:我的 WebView 中有一个 Blob 对象,如何将它传递给 android? 我想把它保存到设备上的本地文件中。
我一直在尝试使用:
var url = webkitURL.createObjectURL(myBlob);
但我无法将其下载到设备。
【问题讨论】:
能否请您添加一些代码? 相关:***.com/questions/2250917/… 【参考方案1】:我还没有尝试过这个,但我能够找到一些指向使用 WebViews 的 javascript 接口的信息。基本上,您可以在 WebView 中分配 Java 类以像 Javascript 类一样工作(并在双方之间交换信息)。 我不是 JavaScript 对象类型方面的专家,所以我将把它留给你。
首先,创建一个JavaScriptHandler
类,其中引用控制WebView
的活动:
public class JavaScriptHandler
MyActivity parentActivity;
public JavaScriptHandler(MyActivity activity)
parentActivity = activity;
public void doSomething(<Your blob format> data)
// .............
// ..Some code..
// .............
之后,您将把您的 JavaScriptHandler
添加到您的主要 Activity
中的 WebView
。不要忘记在您的 WebView
中启用 JavaScript!
myWebView = (WebView)this.findViewById(R.id.myWebView);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.addJavascriptInterface(new JavaScriptHandler(this), "MyHandler");
传递给 addJavaScriptInterface() 的第一个参数是 JavaScript 接口对象本身。第二个参数是 JavaScript 接口对象绑定的全局 JavaScript 变量的名称。
现在你要做的就是用JavaScript
调用你的Java
方法。
<html>
<head>
<script type="text/javascript">
function sendBlob()
MyHandler.doSomething(<Your Blob>);
</script>
</head>
<body>
<form>
<input type="button" value="Click me!" onclick="sendBlob()" />
</form>
</body>
</html>
【讨论】:
【参考方案2】:我通过将 blob 转换为 Base64 字符串找到了解决方案
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function()
var base64data = reader.result;
// send base64data string to android as a method param
【讨论】:
谢谢,但是Android java如何将base64编码的字符串转回二进制? @DavidFaux 使用android.util.Base64
,看看你从 WebView 得到了什么,我不记得它是否以 mime 类型为前缀。但至于解码,android.util.Base64
应该做的工作。
谢谢,这对于像 10mb 以下的小块非常有效。我认为 hex64 编码会使 Chromium 崩溃,因为较大的 blob 像大小为 50mb。
@DavidFaux 你可以将其拆分为 10MB 以下的包并处理这些。【参考方案3】:
您可以通过 JavaScript 使用简单的文件下载器。
这是一个将 blob 下载为文件的示例。
var saveData = (function()
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function(data, fileName)
var json = JSON.stringify(data),
blob = new Blob([json],
type: "octet/stream"
),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
;
());
var data =
x: 42,
s: "hello, world",
d: new Date()
,
fileName = "my-download.json";
saveData(data, fileName);
【讨论】:
这将提醒用户是否要保存文件,并将其保存在公共存储中。 可以,如果要保存文件,可以使用html5的file api,这里是html5rocks.com/en/tutorials/file/dndfiles以上是关于如何将 Blob 对象从 javascript 传递到 Android?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 swift 对象传递给 javascript (WKWebView / swift)
如何通过 HtmlDocument.InvokeScript 将对象作为参数传递给 javascript
如何将asp.net的printeventargs对象传递给javascript