【问题标题】: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");
      }
      

      希望有一天这会对某人有所帮助

      【讨论】:

        猜你喜欢
        • 2015-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        相关资源
        最近更新 更多