【发布时间】:2014-09-01 11:29:19
【问题描述】:
我的 WebView 中有一个 Blob 对象,如何将它传递给 Android?
我想把它保存到设备上的本地文件中。
我一直在尝试使用:
var url = webkitURL.createObjectURL(myBlob);
但我无法将其下载到设备。
【问题讨论】:
-
能否请您添加一些代码?
标签: javascript android html webview blob
我的 WebView 中有一个 Blob 对象,如何将它传递给 Android?
我想把它保存到设备上的本地文件中。
我一直在尝试使用:
var url = webkitURL.createObjectURL(myBlob);
但我无法将其下载到设备。
【问题讨论】:
标签: javascript android html webview blob
我还没有尝试过这个,但我能够找到一些指向使用 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>
【讨论】:
我通过将 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.util.Base64,看看你从 WebView 得到了什么,我不记得它是否以 mime 类型为前缀。但至于解码,android.util.Base64 应该做的工作。
您可以通过 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);
【讨论】: