2014-07-10 71 views
10

我在我的WebView中有一個Blob對象,我該如何將它傳遞給Android?
我想將它保存到設備上的本地文件。如何將JavaScript中的Blob對象傳遞給Android?

我一直試圖用:

var url = webkitURL.createObjectURL(myBlob); 

但我沒有能夠將其下載到設備。

+0

能否請你添加一些代碼的? – Blubberguy22

+0

相關:http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android – BSMP

回答

6

我用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 
    } 
+0

謝謝,但隨後Android java如何將base64編碼的字符串轉換回二進制文件? – dangerChihuahua007

+0

@DavidFaux使用'android.util.Base64',並看看你從WebView中得到了什麼,我不記得它是否以mime類型爲前綴。但至於解碼,'android.util.Base64'應該做的工作。 –

+0

謝謝,這適用於10mb以下的小塊。我認爲hex64編碼會導致Chromium崩潰,例如大小爲50mb的大塊。 – dangerChihuahua007

6

我還沒有嘗試過這一點,但我能夠找到一些信息指向與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.. 
     // ............. 
    } 
} 

之後,你會加入你的JavaScriptHandlerWebView在主Activity。不要忘記在您的WebView中啓用JavaScript!

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

傳遞給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> 
2

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

+0

這會提醒用戶他是否想保存該文件,並將其保存在公共存儲器中。 –

+0

是的,如果你想保存文件,你可以使用html5的文件api,這裏是http://www.html5rocks.com/en/tutorials/file/dndfiles/ –

相關問題