Веб-перегляд Android і локальне зберігання


242

У мене проблема з веб-переглядом, який може отримати доступ до localStorage через HTML5додаток. Файл 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: старий) при використанні локального сховища після перезавантаження програми втратили цю локальну пам’ять. У когось з’явилася ця проблема, і вони голосують за мою відповідь. Якщо у вас є ідеї, ви можете додати ще одну відповідь.
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/");

Це вирішило проблему втрати даних, але що це? Трохи допрацювати?
Сорін Команеску

з опису API: "Для того, щоб API зберігання бази даних функціонував правильно, цей метод повинен бути викликаний шляхом, яким може записати додаток." developer.android.com/reference/android/webkit/…
iTake

15

Рішення, яке працює на моєму Android 4.2.2, складеному з цільової збірки Android 4.4W:

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
Гійом

ДЯКУЮ. Мій начальник просто задав те саме питання. Ця допомога.
hsu.tw

0

якщо у вас кілька веб-перегляду, локальне зберігання працює неправильно.
дві пропозиції:

  1. використовуючи базу даних Java замість локального сховища веб-перегляду, що пояснив "@Guillaume Gendre" (звичайно, це не працює для мене)
  2. локальна сховище працює як json, тому значення зберігаються як "ключ: значення". Ви можете додати в свій браузер унікальний ідентифікатор до свого ключа та за допомогою звичайного локального сховища для Android

Привіт! ми також створили інструмент: кобальт з відкритим кодом для створення додатків із кількома веб-переглядами. Ми розширили localStorage і додали плагін pubsub, щоб "говорити" між веб-переглядами. ( cobaltians.org )
Гійом Джендре
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.