如何将Javascript中的Blob对象传递给Android?

14

我在我的WebView中有一个Blob对象,如何将其传递给Android?
我想将其保存到设备上的本地文件中。

我一直在尝试使用:

var url = webkitURL.createObjectURL(myBlob);

但是我无法将它下载到设备中。


请问您能否添加一些您的代码? - Blubberguy22
相关:https://dev59.com/7nE95IYBdhLWcg3wluwg - BSMP
3个回答

8
我通过将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
  }

谢谢,但是安卓Java如何将Base64编码的字符串转换回二进制呢? - dangerChihuahua007
@DavidFaux 使用android.util.Base64,并查看从WebView获取的内容,我不记得它是否带有mime类型前缀。但是对于解码,android.util.Base64应该可以完成工作。 - Ilya Gazman
2
谢谢,这对小于10MB的Blob很有效。我认为对于像50MB这样的大Blob,hex64编码会导致Chromium崩溃。 - dangerChihuahua007
@DavidFaux 那么你可以将它分割成小于10MB的包并处理它们。 - Ilya Gazman

7
我还没有试过这个方法,但我找到了一些关于在WebViews中使用JavaScript接口的资料。基本上,你可以给Java类分配工作方式,就像在你的WebView中的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>

1
你可以使用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);


这将提示用户是否要保存文件,并将其保存在公共存储中。 - Ilya Gazman
是的,如果您想保存文件,可以使用HTML5的文件API,这里是http://www.html5rocks.com/en/tutorials/file/dndfiles/。 - Laxmikant Dange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接