[android] 안드로이드 웹뷰 및 localStorage

HTML5앱 에서 localStorage에 액세스 할 수있는 웹보기에 문제가 있습니다. 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; 
    } 
}
} 



답변

다음이 누락되었습니다.

settings.setDomStorageEnabled(true);


답변

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


답변

응용 프로그램을 다시 시작한 후 데이터가 손실되는 문제도있었습니다. 이것을 추가하면 도움이되었습니다.

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


답변

빌드 대상 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());
}


답변

앱에서 여러 개의 웹뷰를 사용하는 경우 여전히 문제가 있습니다. localStorage는 모든 웹뷰에서 올바르게 공유되지 않습니다.

여러 웹보기에서 동일한 데이터를 공유하려는 경우 유일한 방법은 Java 데이터베이스 및 Javascript 인터페이스로 복구하는 것입니다.

github 의이 페이지 는이를 수행하는 방법을 보여줍니다.

이 도움을 바랍니다!


답변

웹뷰가 여러 개인 경우 로컬 저장소가 올바르게 작동하지 않습니다.
두 가지 제안 :

  1. “@Guillaume Gendre”가 설명하는 웹 데이터베이스 로컬 저장소 대신 Java 데이터베이스를 사용하십시오. (물론 작동하지 않습니다)
  2. 로컬 스토리지는 json과 같이 작동하므로 값은 “key : value”로 저장됩니다. 키에 브라우저 고유 ID를 추가하고 일반 Android localstorage를 사용하면

답변