如何将Blob对象从javascript传递到Android?

Ily*_*man 10 javascript html5 android blob webview

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

我一直在尝试使用:

var url = webkitURL.createObjectURL(myBlob);
Run Code Online (Sandbox Code Playgroud)

但是我无法将其下载到设备上.

Vul*_*sor 6

我没有试过这个,但我能够找到一些信息指向Javascript接口与WebViews的使用.基本上,您可以将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..
        // .............
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,你会增加你的JavaScriptHandlerWebView在你的主Activity.别忘了在你的身上启用JavaScript WebView!

myWebView = (WebView)this.findViewById(R.id.myWebView);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.addJavascriptInterface(new JavaScriptHandler(this), "MyHandler");
Run Code Online (Sandbox Code Playgroud)

传递给addJavaScriptInterface()的第一个参数是JavaScript接口对象本身.第二个参数是JavaScript接口对象绑定的全局JavaScript变量的名称.

现在你所要做的就是用你的Java方法来调用你的方法JavaScript.

<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>
Run Code Online (Sandbox Code Playgroud)


Ily*_*man 6

我通过将blob转换为Base64 String找到了解决方案

 var reader = new window.FileReader();
 reader.readAsDataURL(blob); 
 reader.onloadend = function() {
                var base64data = reader.result;                
                // send base64data string to android as a method param
  }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这对于小于 10mb 的小 blob 效果很好。我认为 hex64 编码会导致 Chromium 崩溃,例如大小为 50mb 的较大 blob。 (2认同)