IndexedDB 在 Android 本机应用程序中工作

IndexedDB work in Android native app

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

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

我们决定在 HTML5 中使用 IndexedDB 在本地存储信息。现在存储有效(据我所知 :) )。下一个问题是通过app获取这些信息,目前还没有解决。不幸的是 google 没有帮助我。

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

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

更新

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

捕获保存文件完美无缺。但是 url 路径看起来像 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 相同。

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

如果没有,您可以添加一个java脚本界面。只需将数据作为 JSON 字符串传递,然后在 java 端对其进行解码。

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

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

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

  1. 创建 javascript 函数,它将 return 中的属性 具体图案。
  2. 创建 WebChromClient 并覆盖 onJsAlert() 方法。信息 onJsAlert 的参数具有 returned 的消息字符串。解析 获取所需属性的消息字符串。
  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;
       }
    }
    

要调用 Java脚本函数来获取数据,请使用以下代码。这里的 testFunction() 是 return 字符串格式数据的函数。

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

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

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

我们决定使用 ServerSocket 本地主机作为设备上的 Web 服务器。然后 Html 向它发送 http 响应。可能使用 @Michael2 所写的 java 脚本绑定会更好,但我们的解决方案是在他的 post 之前实现的。 :-)