IndexedDB在Android原生应用中运行

时间:2017-03-21 06:35:39

标签: java android indexeddb

我们已经申请查看某些特定材料。在材质类型中,HTML5演示文稿显示在应用内的WebView小部件中。现在我们需要获得有关此视图的详细信息(例如幻灯片放映持续时间,列表元素选择可用的位置等)。

这是客户想要的 - 我们无法改变它。

我们决定在IndexedDB内使用HTML5在本地存储信息。现在存储作品(据我所知:))。接下来的问题是通过应用程序获取此信息,但尚未解决。不幸的是,谷歌并没有帮助我。

如果我知道其路径,如何从IndexedDB文件获取信息?或者您是否知道将数据从html传输到本机应用程序的另一种方式?

P.S。编写自定义浏览器无法解决问题。

更新

找到从JS加载文件的解决方案。在Chrome浏览器中,它会自动保存下载内容。在Android应用程序中,我设置为WebView对象DownloadListener来监听文件保存事件。

捕获保存文件非常有效。但是网址路径看起来像blob:file/...,我无法从中获取信息。尝试使用ContentResolver,创建File对象,将blob:字符串替换为空,启动ACTION_VIEW意图 - 没有任何帮助。

更新

尝试使用DownloadManagerDownloadManager.Request - 它会抛出异常

java.lang.IllegalArgumentException: Can only download HTTP/HTTPS URIs: file:///fa4857ad-0e86-454a-a341-123729e9ece0

blob:file uri相同。

3 个答案:

答案 0 :(得分:1)

是否需要使用IndexedDB进行通信?

如果没有,您可以添加一个javascript界面​​。只需将数据作为JSON字符串传递,然后在java端解码它。

https://developer.android.com/guide/webapps/webview.html#BindingJavaScript

注意安全(不允许用户浏览不同的页面,清理传入的数据,......); - )

答案 1 :(得分:1)

您可以通过从Java调用JavaScript函数并以特定模式返回所需属性来解决问题。实现这个

  1. 创建将返回属性的javascript函数 具体模式。
  2. 创建WebChromClient并覆盖onJsAlert()方法。信息 onJsAlert的参数具有返回的消息字符串。解析 消息字符串以获取所需的属性。
  3. 从Java代码调用JavaScript函数以获取值。

    final class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            result.confirm();
            // Parse the message to get the required attributes
            Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
            return true;
       }
    }
    
  4. 调用JavaScript函数获取数据使用下面的代码。这里testFunction()是以字符串格式返回数据的函数。

    webView.loadUrl("javascript:alert(testFunction())");
    

    创建WebChromeClient的实例并在webview中设置,也不要忘记启用JavaScript。

    WebView webView = (WebView)findViewById(R.id.web_view);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebChromeClient(new MyWebChromeClient());
    

答案 2 :(得分:0)

我们决定将ServerSocket用于localhost作为设备上的Web服务器。然后Html向其发送http响应。可能正在使用java脚本绑定,因为写的@Michael2会更好,但我们的解决方案是在他的帖子之前实现的。 : - )