【问题标题】:How to pass a Blob object from javascript to Android?如何将 Blob 对象从 javascript 传递到 Android?
【发布时间】:2014-09-01 11:29:19
【问题描述】:

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

我一直在尝试使用:

var url = webkitURL.createObjectURL(myBlob);

但我无法将其下载到设备。

【问题讨论】:

标签: javascript android html webview blob


【解决方案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);

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2014-03-28
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多