【问题标题】:Upgrading from PhoneGap to Native从 PhoneGap 升级到 Native
【发布时间】:2013-12-07 10:36:48
【问题描述】:
我有一个 PhoneGap 应用程序,我使用 HTML5 LocalStorage 来保存用户数据(如用户令牌、用户名等)。
问题是,最近我们决定从 PhoneGap 迁移到原生 Android 应用程序。但是我需要解决一件事:
是否可以使用 java 代码从 HTML5 LocalStorage 中获取数据?我们不希望用户在更新后退出,所以我需要一种方法从该 LocalStorage 中获取用户令牌并将其保存在 SharedPreferences 中。
提前致谢!
【问题讨论】:
标签:
android
mobile
cordova
local-storage
【解决方案1】:
这是可能的。要执行 JavaScript 并获得响应,您可以执行以下操作:
在代码中定义 JavaScript 回调接口:
class MyJavaScriptInterface {
public void someCallback(String jsResult) {
// this will be passed the local storage name variable
}
}
将此回调附加到您的 WebView:
MyJavaScriptInterface javaInterface = new MyJavaScriptInterface();
webView.addJavascriptInterface(javaInterface, "HTMLOUT");
Run your JavaScript calling window.HTMLOUT.someCallback from the script:
webView.loadUrl("javascript:( function () { var name = window.localStorage['name'];
window.HTMLOUT.someCallback(name); } ) ()");
注意 - window.localStorage['name'] 与 window.localStorage.getItem('name') 相同
stackoverflow 上的这篇文章帮助了我
您可能需要使用 super.webView.addJavascriptInterface 或 super.addJavascriptInterface 来添加接口。您可能需要使用 super.webView.loadUrl 或 super.loadUrl 来调用它。这完全取决于您将从哪里调用这些。
【解决方案2】:
prakash 为我指明了正确的方向,但缺少一些东西:
public class MyJavaScriptInterface { //the class and the callbacks must be public
@JavascriptInterface //this is needed for android 4.2 and above
public void someCallback(String jsResult) {
// this will be passed the local storage name variable
}
}
需要为 webView 配置一些设置:
public void importPhoneGapUser() {
String databasePath = getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
String pathToCache = getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
WebView mAuthWebView = new WebView(this);
WebSettings webSettings = mAuthWebView.getSettings();
webSettings.setDatabasePath(databasePath);
webSettings.setAppCachePath(pathToCache);
webSettings.setGeolocationDatabasePath(databasePath);
webSettings.setAppCacheMaxSize(5 * 1048576);
webSettings.setAppCacheEnabled(true);
webSettings.setDatabaseEnabled(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
mAuthWebView.addJavascriptInterface(new MyJavaScriptInterface (), "JsInterface");
//i wasn't able to run JS through 'javascript:' protocol, so i had to use a HTML file
mAuthWebView.loadUrl("file:///android_asset/import_auth.html");
}
希望有一天这会对某人有所帮助