如何将 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

将参数传递给 BLOB 对象 URL

如何将asp.net的printeventargs对象传递给javascript

如何将音频 blob 从 javascript 发送到 python?

JavaScript 将base64 转换为File