Override 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网络视图似乎忽略了我的数据。啊,好吧,我希望它对你有用。对我来说,只需调用 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() 方法的方法。
除非谷歌的某个人在WebView中添加一个公共方法来触发重新填充,否则恐怕实际上不可能实现你的目标。对不起:(
顺便说一句,所有这些本地访问历史记录处理确实让我想知道:为什么硬件制造商如此关心我们访问了哪些网址?;)<<<讽刺