Как очистить (CSS) историю посещений Android WebView?

Я пытаюсь повторно использовать существующий WebView, очищая любые личные данные, оставленные предыдущим пользователем:

CookieManager.getInstance().removeAllCookie();
webview.clearHistory();
webview.clearFormData();
webview.clearCache(true);

clearHistory кажется, что только очистить список назад/вперед, доступный через API, но не внутренний список, используемый для окраски ссылок внутри веб-контента.

Я даже попробовал следующее, предложенное другим qaru.site/info/72103/...:

deleteDatabase("webview.db");
deleteDatabase("webviewCache.db");

Мне все еще не повезло: селектор CSS :visited все еще работает после перезагрузки страницы.

Альтернативой может быть использование функции частного просмотра API уровня 11 (новый аргумент конструктора), но тогда я вообще не могу воспользоваться посещенными ссылками; и больше не может ориентироваться на более старые версии.

Возможно, у кого-то есть решение этой проблемы? Благодарим за помощь.

Резюме ответов, которые я получил до сих пор:

Я попробовал эти два ответа, но первый, похоже, очищает хранилище данных HTML5, и последнее похоже на специфику встроенного браузера:

WebStorage.getInstance().deleteAllData();
Browser.clearHistory(getContentResolver());

WebChromeClient.getVisitedHistory(ValueCallback<String[]> callback) вызывается только после того, как я впервые создал новый WebView в недавно установленном приложении.

Я попытался удалить WebView из hierachy из представления и создать новый, но, к сожалению, посещаемая история, похоже, сохраняется для всего приложения.

Ответы

Ответ 1

Переопределить WebChromeClient и WebViewClient... Черт, это было скрыто.

Мне действительно пришлось выкапывать немного, чтобы узнать об этом.

WebView webView = (WebView)findViewById(R.id.myWebView);
WebChromeClient myWebChromeClient = new WebChromeClient(){
        @Override
        public void getVisitedHistory(ValueCallback<String[]> callback) {
// called during webview initialization, original implementation does strictly nothing 
// and defaults to the native method WebViewCore.nativeProvideVisitedHistory()
            String[] myUserHistory = getVisitedUrlsFromMyOwnDatabase(userId);
            callback.onReceiveValue(myUserHistory);
        }
    };
WebViewClient myWebViewClient = new WebViewClient(){
    @Override
public void doUpdateVisitedHistory(WebView view, String url,
        boolean isReload) {
// called whenever there is a new link being visited
        insertIfNotExistVisitedUrlIntoMyOwnDatabaseForUser(userId);
        super(view, url, isReload);
}
}
webView.setWebViewClient(myWebViewClient);
webView.setChromeClient(myWebChromeClient);
webView.getSettings().etc(whatever)...

Я думаю, что я "почти там". Вот часть, которой я управлял: что она делает до сих пор, удаляет историю css вообще, поэтому мы на полпути. Я не могу заставить браузер распознавать формат url, который я предоставляю в "myUserHistory", поэтому в действительности единственная функция, которую этот код делает, - это reset история css вообще, но она вызывается только один раз, когда WebView инстанцируется (или создано, не проверено), поэтому для истинного многопользовательского опыта вам нужно будет воссоздать веб-просмотр при каждом входе в систему.

Моя проблема в том, что я не могу правильно загрузить urlHistory. Мой веб-просмотр Honeycomb Xoom, похоже, игнорирует мои данные. Хорошо, надеюсь, это сработает для вас. Для меня просто вызов callback.onReceiveValue(новый String [] {}); в getVisitedHistory() будет достаточно хорошо.

EDIT: Я просто положил еще двадцать минут, потому что мне любопытно. Этот метод является тем, что делегирует WebChromeClient (mCallbackProxy = WebChromeClient).

protected void populateVisitedLinks() {
     ValueCallback callback = new ValueCallback<String[]>() {
         public void onReceiveValue(String[] value) {
             sendMessage(EventHub.POPULATE_VISITED_LINKS, (Object)value);
         }
     };
     mCallbackProxy.getVisitedHistory(callback);
 }

Он защищен в WebViewCore, который является частным атрибутом WebView без доступа. Делегаты sendMessage для EventHub, которые являются частными, и WebViewCore заполняются частными собственными методами, и один из них, по-видимому, фактически вызывает метод populateVisitedLinks() во время инициализации.

Если кто-то из Google не добавляет публичный метод WebView для запуска репопуляции, я боюсь, что практически невозможно достичь вашей цели. Извините: (

В качестве побочного примечания, все эти загруженные истории обработки истории действительно заставляют меня задуматься: почему производители оборудования так много заботятся о том, какие URL-адреса мы посетили?;) < Сарказм

Ответ 2

В качестве альтернативного решения вы можете попробовать добавить свой собственный CSS с теми же базовыми цветами, что и CSS по умолчанию, и переключить CSS на другой (с тем же цветом для обоих типов ссылок), если вы хотите reset посещенные ссылки.

A:link{color: "#990000"; text-decoration: none;}
A:visited{color: "#990000"; text-decoration: none;}
A:hover{color: "#ff0000"; text-decoration: none;}

Ответ 3

Если вы можете получить экземпляр Browser (возможно, вы можете установить WebChromeClient в WebView), вы можете использовать его clearHistory().

Ответ 4

Имеет ли WebStorage.clearAllData() желаемый эффект? К сожалению, документация в этом классе очень скудна по сравнению с WebView и не говорит, относится ли она к WebViews.

Точное время, которое вы вызываете clearHistory(), также может иметь эффект. Очистка, а затем переход на новую страницу могут сохранить первую страницу в истории, и вы должны вызвать метод после загрузки новой страницы.

Лично, если конфиденциальность является реальной проблемой, я бы создал новый набор объектов с нуля для этого нового сеанса, если это возможно.