2011-05-13 16 views
15

trato de volver a utilizar una vista Web existente en la limpieza de los datos privados del usuario anterior quedan:¿Cómo borrar el historial visitado (CSS) de un Android WebView?

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

clearHistory parece sólo para despejar el/la lista hacia adelante hacia atrás, accesible a través de la API, pero no la lista interna utilizado para colorear enlaces dentro del contenido web.

Incluso he intentado lo siguiente, sugerido por otro stackoverflow answer:

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

Todavía no tengo suerte: CSS :visited selectores siguen trabajando después de volver a cargar la página.

Una alternativa sería utilizar la función de navegación privada de nivel 11 de API (nuevo argumento de constructor), pero no puedo aprovechar los enlaces visitados en absoluto; y ya no puede orientar las versiones anteriores.

Quizás alguien tenga una solución para este problema? Gracias por tu ayuda.

Resumen de las respuestas que tengo hasta ahora:

me trataron estas dos respuestas, pero el primero parece borrar el almacenamiento de datos HTML5 y la última parece ser específica para el navegador integrado:

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

WebChromeClient.getVisitedHistory(ValueCallback<String[]> callback) solo se llama después de la primera vez que creo un nuevo WebView en una aplicación recientemente instalada.

Intenté eliminar el WebView de la jerarquía de vista y creo una nueva, pero desafortunadamente el historial visitado parece estar almacenado para toda la aplicación.

Respuesta

3

Sobreescribe WebChromeClient y WebViewClient ... Maldita sea que estaba oculta.

De hecho tuve que desenterrar a bit para descubrir esto.

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)... 

Creo que estoy "casi allí". Aquí está la parte que manejé: lo que hace hasta ahora es eliminar completamente la historia de CSS, así que estamos a mitad de camino. No puedo hacer que el navegador reconozca el formato url que estoy proporcionando en "myUserHistory", así que, en efecto, la única característica que este código hace es restablecer el historial css por completo, pero solo se llama una vez cuando se instancia (o crea) WebView. no revisó), por lo que para una verdadera experiencia multiusuario necesitaría volver a crear la vista web en cada inicio de sesión.

Mi problema ahora es que no puedo cargar el urlHistory correctamente. La vista web de mi Honeycomb Xoom parece ignorar mis datos. Ah, bueno, espero que funcione para usted. Para mí solo llamo a callback.onReceiveValue (new String [] {}); en getVisitedHistory() será lo suficientemente bueno.

EDIT: Acabo de poner veinte minutos más en él porque tengo curiosidad. Este método es lo que delega a 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); 
} 

Está protegido en WebViewCore, que es un atributo privado de WebView sin acceso. El sendMessage delega en EventHub, que es privado, y WebViewCore está lleno de métodos nativos privados, y uno de estos parece ser el que llama al método populateVisitedLinks() durante la inicialización.

A menos que alguien en Google agregue un método público a WebView para activar la repoblación, me temo que es prácticamente imposible lograr su objetivo. Lo sentimos :(

Como nota al margen, todos estos nativa visitó la manipulación historia realmente me hace pensar: ¿por qué los fabricantes de hardware se preocupan tanto por los URL que visitamos;) < < < sarcasmo

+0

Gracias por el esfuerzo, me gusta la idea, pero el problema es que no se llama a 'getVisitedHistory' en cada carga de página (como ya ha indicado). Tal vez vale la pena el esfuerzo comprobar si la invocación de 'getVisitedHistory' se puede forzar de alguna manera. – Nappy

+0

Acabo de actualizar mi respuesta con mi pensamiento personal sobre el asunto. –

1

Como solución alternativa, puede intentar agregar su propio CSS con los mismos colores base que el CSS predeterminado y cambiar el CSS por otro (con el mismo color para ambos "tipos" de enlaces) cuando desee restablecer el enlaces visitados

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

utilizo la vista Web como? un navegador. El usuario puede navegar a cualquier lugar. – Nappy

0

¿Tiene el efecto deseado WebStorage.clearAllData()? Desafortunadamente, el documentation en esta clase es muy escaso en comparación con WebView y no dice si se aplica a WebViews.

La hora exacta en que llame clearHistory() también puede tener un efecto. Limpiarlo y luego navegar a una nueva página aún puede mantener la primera página en el historial, y debe llamar al método after the new page has loaded.

Personalmente, si la privacidad es un problema real, crearía un nuevo conjunto de objetos desde cero para esta nueva sesión, si es posible.

1

Si usted puede obtener una instancia de Browser (tal vez se puede establecer una WebChromeClient-WebView), puede utilizar su método clearHistory().

Cuestiones relacionadas