当前位置: 首页 > 面试题库 >

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

卫骏
2023-03-14
问题内容

我尝试通过清除先前用户留下的所有私有数据来重用现有的WebView:

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

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

我什至尝试了以下方法,由另一个建议:

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

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

一种替代方法是使用API​​级别11的私有浏览功能(新的构造函数参数),但随后我根本无法从访问的链接中受益;并且不能再定位较旧的版本。

也许有人对此问题有解决方案?谢谢你的帮助。

到目前为止,我得到的答案摘要:

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

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

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

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


问题答案:

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

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

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

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

附带说明一下,所有这些本机访问的历史记录处理确实使我感到奇怪:为什么硬件制造商如此关心我们访问了哪些URL?;)



 类似资料:
  • 问题内容: 我正在做一个简单的项目,让我们选择高度安全的网站。我有5个不同的JSP页面。如果我从第一个JSP页面开始,它将重定向到第二个JSP页面,依此类推。同时,它不应该在我的浏览器历史记录中存储这些页面。如何使用JavaScript清除那些浏览历史记录? 问题答案: 您可以尝试使用它来清除历史记录中的最后一个条目,并将其替换为新url的地址吗?从文档历史记录中删除当前文档的URL,这意味着无法

  • 我正在爱奥尼亚4中创建一个注销页面,我想要的是清除路由器历史记录,以便“后退”按钮不起作用,另外,我想知道在导航到登录屏幕或导航到登录页面之前,如何销毁注销页面。 我尝试运行构造函数中的代码以清除本地存储,第一次运行正常,但第二次没有运行该代码。据我了解,该页面已经加载,因此不会再次运行构造函数。我尝试将我的代码放在ngDoCheck()中,但它触发了多次,我不想要。 我想清除路由历史记录,以便在

  • 问题内容: 我最近更新了我的一个哈德逊版本的配置。生成历史记录不同步。有什么方法可以清除我的构建历史记录? 谢谢,麻烦您了 问题答案: 如果单击“从磁盘管理Hudson /重新加载配置”,Hudson将重新加载所有构建历史记录数据。 如果磁盘上的数据混乱,则需要转到%HUDSON_HOME%\ jobs \ < projectname 目录,并按预期方式还原构建目录。然后重新加载配置数据。 如果仅

  • 是否有可能删除使用pushState创建的假历史记录? 我无法将状态存储在localStorage中,因为我的状态数组中有函数。

  • 问题内容: 当用户加载页面时,我立即将窗口重定向到另一个位置。 问题是,当用户单击返回时,它将返回到执行重定向的页面。 我可以“取消”上一页的历史吗?这样,当用户单击时,它将返回两页吗? 问题答案: 与其使用重定向, 尝试: 使用replace()之后,当前页面将不会保存在会话历史记录中,这意味着用户将无法使用“后退”按钮导航到该页面。

  • 读取播放历史信息 调用地址 http://api.bilibili.cn/history 返回 返回值字段 字段类型 字段说明 results int 返回的记录总数目 list object 返回数据 返回字段 “list” 子项 返回值字段 字段类型 字段说明 aid int 视频编号 typeid int 视频分类ID typename string 视频分类名称 title string