Android WebViewとlocalStorage


242

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; 
    } 
}
} 

回答:


517

以下が欠落していた:

settings.setDomStorageEnabled(true);

1
同じ:)どうもありがとう。また、少なくともAndroid 2.1以降をターゲットとすることを確認する必要がありました。マニフェストにandroid:minSdkVersion = "7"を追加し、(Eclipseの)プロジェクトビルドターゲットを少なくとも2.1に変更してください。
danmux '19年

45

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/");
}

1
@Ram swaroopローカルストレージを有効にするには、setDomStorageEnabled(true)を使用するだけで十分かもしれません。最新バージョンのAndroidとデバイスを使用している可能性がありますが、この問題は発生していません。(たぶん、setDomStorageEnabled(true)を使用してローカルストレージを有効にするだけで十分かもしれません)が、アプリケーションの再起動後にローカルストレージを使用するAndroid(Exm:old)の一部のバージョンでは、このロケールストレージが失われました。誰かがこの問題を引き起こし、私の答えに賛成票を投じます。アイデアがあれば、別の答えを追加することもできます。
mr.boyfox 2014年

私はあなたの解決策を試しましたが、アプリが強制終了/再起動された後もlocalStorageは持続しませんが、何度も再起動した後、localStorageが機能を再開し、そこに保存されていたデータが正しく取得されます。これは異常ですが、私の場合に起こります。(Sony Xperia SPでテスト済み)
Ram Patra

@Ramswaroop Nexus4を使用していますが、ローカルストレージにも問題はありません。しかし、Samsung Galaxy SIIでテストしたところ、この問題がありました。すべてのデバイスが動作していると言っているのではなく、一部のデバイスがそれを持っているだけです。
mr.boyfox 2014年

25

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

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

それはデータ損失の問題を解決しましたが、これは何ですか?少し詳しく?
Sorin Comanescu 2013年

APIの説明から:「正しく機能するために、データベースのストレージAPIためには、このメソッドは、アプリケーションが書き込むことができるようにパスを呼び出さなければなりません。」developer.android.com/reference/android/webkit/...
iTake

15

ビルドターゲット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());
}

4

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

同じデータを複数のWebビューで共有したい場合は、JavaデータベースとJavaScriptインターフェースでデータを修復するしか方法はありません。

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

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


こんにちは!このlocalStorageの修正とハイブリッドアプリ用のクールなツールを中心にツールを構築しました。コバルトは、複数のWebビューでアプリを構築するためのオープンソースフレームワークです。localStorageを拡張し、Webビュー間の「会話」にpubsubプラグインを追加しました。見ていcobaltians.orgを
ギヨームGendre

どうも。上司も同じ質問をしました。この助け。
hsu.tw

0

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

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

こんにちは!また、ツールを構築しました。コバルトは、複数のWebビューでアプリを構築するためのオープンソースフレームワークです。localStorageを拡張し、Webビュー間の「会話」にpubsubプラグインを追加しました。(cobaltians.org
Guillaume Gendre、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.