web-dev-qa-db-ja.com

Android webviewおよびlocalStorage

HTML5アプリからlocalStorageにアクセスする可能性のあるWebビューに問題があります。 test.htmlファイルは、ブラウザ(webview)でローカルストレージがサポートされていないことを通知します。提案があれば..

package com.test.HelloWebView; 
import Android.app.Activity; 
import Android.content.Context; 
import Android.os.Bundle; 
import Android.util.Log; 
import Android.view.KeyEvent; 
import Android.webkit.WebChromeClient; 
import Android.webkit.WebSettings; 
import Android.webkit.WebStorage; 
import Android.webkit.WebView; 
import Android.webkit.WebViewClient; 
public class HelloWebView extends Activity { 
WebView webview; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    webview = (WebView) findViewById(R.id.webview); 
    webview.getSettings().setJavaScriptEnabled(true); 
    webview.setWebViewClient(new HelloWebViewClient()); 
    webview.loadUrl("file:///Android_asset/test.html"); 
    WebSettings settings = webview.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    settings.setDatabaseEnabled(true); 
    String databasePath = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath(); 
    settings.setDatabasePath(databasePath);
    webview.setWebChromeClient(new WebChromeClient() { 
    public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 
            quotaUpdater.updateQuota(5 * 1024 * 1024); 
        } 
    }); 
} 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { 
        webview.goBack(); 
        return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
private class HelloWebViewClient extends WebViewClient { 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return true; 
    } 
}
} 
218
Thomas

以下が欠落していました。

settings.setDomStorageEnabled(true);
466
Thomas

setDatabasePath() メソッドはAPIレベル19で廃止されました。次のようなストレージロケールを使用することをお勧めします。

webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setDatabaseEnabled(true);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KitKat) {
    webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
}
42
mr.boyfox

また、アプリケーションの再起動後にデータが失われるという問題もありました。これを追加すると助けました:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
24
iTake

ビルドターゲットAndroid 4.4WでコンパイルされたAndroid 4.2.2で機能するソリューション:

WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
settings.setDatabaseEnabled(true);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KitKat) {
    File databasePath = getDatabasePath("yourDbName");
    settings.setDatabasePath(databasePath.getPath());
}
14
AngryWolf

アプリで複数のWebビューを使用している場合、依然として問題が発生します。localStorageはすべてのWebビューで正しく共有されていません。

複数のWebビューで同じデータを共有する場合、唯一の方法はJavaデータベースとjavascriptインターフェイスを使用してデータを修復することです。

このページ githubでこれを行う方法を示しています。

この助けを願っています!

3

複数のWebビューがある場合、localstorageは正しく機能しません。
2つの提案:

  1. 代わりにJavaデータベースを使用して、「@Guillaume Gendre」が説明したwebview localstorageを使用します。(もちろん、私には機能しません)
  2. ローカルストレージはjsonのように機能するため、値は「key:value」として保存されます。ブラウザの一意のIDをキーに追加し、通常のAndroid localstorageを使用できます。
0
MHP