java - 如何清除 Android WebView 的(CSS)访问历史记录?

标签 java android css caching

我尝试通过清除前一个用户留下的任何私有(private)数据来重用现有的 WebView:

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

clearHistory似乎只清除后退/前进列表,可通过 API 访问,而不是用于为网页内容中的链接着色的内部列表。

我什至尝试了以下由另一个人建议的 stackoverflow answer :

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

我仍然没有运气:CSS :visited选择器在重新加载页面后仍然有效。

另一种方法是使用 API 级别 11 隐私浏览功能(新的构造函数参数),但是我根本无法从访问过的链接中获益;并且不能再针对旧版本。

也许有人可以解决这个问题?感谢您的帮助。

到目前为止我得到的答案总结:

我尝试了这两个答案,但第一个似乎清除了 HTML5 数据存储,而后者似乎特定于内置浏览器:

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

WebChromeClient.getVisitedHistory(ValueCallback<String[]> callback)仅在我第一次在最近安装的应用程序中创建新的 WebView 后调用。

我试图删除 WebView从 View 层次结构中创建一个新的层次结构,但不幸的是,访问的历史记录似乎是为整个应用程序存储的。

最佳答案

覆盖 WebChromeClient 和 WebViewClient...该死的被隐藏了。

我实际上不得不挖掘a bit找出这个。

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 历史记录,所以我们已经完成了一半。我无法让浏览器识别我在“myUserHistory”中提供的 url 格式,因此实际上这段代码的唯一功能是完全重置 css 历史记录,但它仅在实例化(或创建)WebView 时调用一次,没有检查),因此为了获得真正的多用户体验,您需要在每次登录时重新创建 WebView 。

我现在的问题是无法正确加载 urlHistory。我的 Honeycomb Xoom webview 似乎忽略了我的数据。 嗯,我希望它对你有用。对我来说只是调用 callback.onReceiveValue(new String[]{});在 getVisitedHistory() 中就足够了。

编辑: 我只是多花了二十分钟,因为我很好奇。此方法委托(delegate)给 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 的私有(private)属性,没有访问器。 sendMessage 委托(delegate)给私有(private)的 EventHub,而 WebViewCore 充满私有(private) native 方法,其中之一似乎是在初始化期间实际调用 populateVisitedLinks() 方法的方法。

除非 Google 的某人向 WebView 添加一个公共(public)方法来触发重新填充,否则恐怕几乎不可能实现您的目标。对不起:(

附带说明一下,所有这些 native 访问历史记录处理真的让我想知道:为什么硬件制造商如此关心我们访问了哪些 url? ;) <<< 讽刺

关于java - 如何清除 Android WebView 的(CSS)访问历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5992816/

相关文章:

android - 由于 : 'Failed to commit install session 881743286 with command cmd package install-commit 881743286 安装失败

java - 有没有什么有效的方法可以从动态更新的java ConcurrentHashMap中获取随机值?

java - 发生错误。请查看日志文件 - eclipse juno

android - 无法访问 viewBinding

android - FCM(Firebase Cloud Messaging)发送到多个设备组

html - 垂直对齐 :middle doesn't work in Bootstrap button

css - 如何选择不是第一个 tr 而不是最后一个 td

html - 背景渐变未在 chrome 中呈现

java - 返回扩展类

java - 如何从文件中查找最大值