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
意图 - 没有任何帮助。
更新
尝试使用 DownloadManager
和 DownloadManager.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 所需的属性来解决问题。实现这个
- 创建 javascript 函数,它将 return 中的属性
具体图案。
- 创建 WebChromClient 并覆盖 onJsAlert() 方法。信息
onJsAlert 的参数具有 returned 的消息字符串。解析
获取所需属性的消息字符串。
从 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 之前实现的。 :-)
我们有查看某些特定 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
意图 - 没有任何帮助。
更新
尝试使用 DownloadManager
和 DownloadManager.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 所需的属性来解决问题。实现这个
- 创建 javascript 函数,它将 return 中的属性 具体图案。
- 创建 WebChromClient 并覆盖 onJsAlert() 方法。信息 onJsAlert 的参数具有 returned 的消息字符串。解析 获取所需属性的消息字符串。
从 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 之前实现的。 :-)