안드로이드 웹뷰 및 localStorage


242

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

답변:


518

다음이 누락되었습니다.

settings.setDomStorageEnabled(true);

1
같은 :) 감사합니다. 또한 Android 2.1 이상을 대상으로해야합니다. 매니페스트에 android : minSdkVersion = "7"을 추가하고 프로젝트 빌드 대상 (일식)을 2.1로 변경하십시오.
danmux

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

귀하의 솔루션으로 시도했지만 앱이 종료 / 재시작 된 후에도 여전히 localStorage가 지속되지 않지만 때로는 많은 재시작 후에 localStorage가 작동을 재개하고 거기에 저장된 데이터가 올바르게 검색됩니다. 이것은 드문 일이지만 내 경우에 발생합니다. (Sony Xperia SP에서 테스트 됨)
Ram Patra

@Ramswaroop Nexus4를 사용하고 있으며 로컬 저장소에도 문제가 없습니다. 그러나 Samsung Galaxy SII에서 테스트했을 때이 문제가있었습니다. 모든 장치가 작동한다고 말하는 것은 아니며 일부 장치에만 작동합니다.
mr.boyfox

25

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

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

데이터 손실 문제를 해결했지만 이것이 무엇입니까? 조금 정교하게?
Sorin Comanescu

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

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

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

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

이 도움을 바랍니다!


안녕하세요! 우리는이 localStorage 픽스와 하이브리드 앱을위한 멋진 도구 인 코발트를 개발했습니다. 우리는 localStorage를 향상시키고 pubsub 플러그인을 추가하여 웹뷰 사이를 "대화"했습니다. cobaltians.org
Guillaume Gendre

고마워. 상사는 같은 질문을했습니다. 도움이됩니다.
hsu.tw

0

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

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

안녕하세요! 또한 웹뷰가 여러 개인 앱을 빌드하기위한 오픈 소스 프레임 워크 인 코발트 도구도 개발했습니다. 우리는 localStorage를 향상시키고 pubsub 플러그인을 추가하여 웹뷰 사이를 "대화"했습니다. ( cobaltians.org )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.