Как передать объект Blob с javascript на Android?

У меня есть объект Blob внутри моего WebView, как я могу передать его на Android?
Я хочу сохранить его в локальном файле на устройстве.

Я пытался использовать:

var url = webkitURL.createObjectURL(myBlob);

Но я не смог загрузить его на устройство.

Ответ 1

Я нашел решение, преобразовывая 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
  }

Ответ 2

Я не пробовал это, но мне удалось найти некоторую информацию, указывающую на использование интерфейсов Javascript с WebView. В принципе, вы можете назначить Java Classes работать как классы Javascript в вашем WebView (и обмениваться информацией между обеими сторонами). Я не являюсь профессионалом в отношении типов объектов JavaScript, поэтому я оставлю это вам.

Сначала создайте класс JavaScriptHandler со ссылкой на вашу активность, которая управляет WebView:

public class JavaScriptHandler {
    MyActivity parentActivity;

    public JavaScriptHandler(MyActivity activity) {
        parentActivity = activity;
    }

    public void doSomething(<Your blob format> data){    
        // .............
        // ..Some code..
        // .............
    }
}

После этого вы добавите JavaScriptHandler в свой WebView в свой основной Activity. Не забудьте включить JavaScript в своем WebView!

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>

Ответ 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);