2011-07-18 21 views
21

-Edit: Solución encontrada-
Lo encontré después de una búsqueda intensa: una persona (literalmente me refiero a una) dijo que en su lugar usaba en PageLoad(); que funcionó perfectamente para mis propósitos. La diferencia es que onPageLoad() se ejecuta más tarde que shouldOverrideUrlLoading, pero no hace una diferencia en mi código.shouldOverrideUrlLoading en WebView para Android que no se ejecuta

Estoy tratando de configurar la autorización de Twitter con OAuth para una aplicación de Android, y hasta ahora puedo enviar al usuario con éxito a la URL de autorización, sin embargo, lo que intento hacer ahora es interceptar la redirección a la devolución de llamada (lo que daría lugar a un error 404, nuestra URL de devolución de llamada no va a tener una página asociada en nuestros servidores). Lo que intento hacer es verificar si la URL es nuestra devolución de llamada, luego extraer el verificador OAuth de la URL. Cómo fijo mi vista web con este código:

view = (WebView)findViewById(R.id.twitterWbVw); 
view.setWebViewClient(new WebViewClient(){ 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView wView, String url) 
    { 
     String urlHolder; 
     String[] verifExtrctr; 
     urlHolder = url.substring(0, url.indexOf('?')); 
     System.out.println("url"); 
     if(urlHolder.equalsIgnoreCase(CALLBACK_URL)) 
     { 
      verifExtrctr = urlHolder.split("?"); 
      verifExtrctr = verifExtrctr[2].split("="); 
      if(verifExtrctr[0].equalsIgnoreCase("oauth_verifier")) 
      { 
       params[5] = verifExtrctr[1]; 
       return true; 
      } 
      else 
      { 
       System.out.println("Inocorrect callback URL format."); 
      } 
     } 
     else  
     { 
      wView.loadUrl(url); 
     } 
     return true; 
    } 
}); 
view.loadUrl(urlAuthorize.toExternalForm()); 

cosa es aun System.out.println ("URL"); (que estoy utilizando para depurar) no se ejecuta! Así que estoy bastante seco en las ideas, y no puedo encontrar a nadie con un problema similar. La URL de autorización es correcta y puedo autorizar la aplicación con éxito, sin embargo, la redirección a la URL de devolución de llamada nunca se ha interceptado. Cualquier ayuda sería apreciada, esto está en mi onResume() si eso importa.

+0

¿Estás seguro de que shouldOverrideUrlLoading es el método correcto que deseas anular? –

+0

Estoy bastante seguro - Por lo que he leído, se ejecuta cada vez que se carga una URL – Justin

+0

si 'System.out.println ("url"); 'no se está ejecutando. Puede que solo compruebe tres veces que está anulando el método correcto –

Respuesta

48

Después de algunas investigaciones que concluyen que a pesar de lo que la mayoría de los tutoriales por ahí dicen, shouldOverrideUrlLoading() no ser llamado cuando:

  1. Se carga una URL como

    loadUrl("http://www.google.com"); 
    
  2. El navegador vuelve a dirigir el usuario automáticamente a través de un redireccionamiento HTTP. (Véase el comentario de @hmac a continuación en relación con las redirecciones)

Sin embargo, sí, ser llamado cuando se hace clic en un enlace dentro de una página web dentro de la vista web. IIRC la autorización de Twitter usa un redireccionamiento HTTP. Demonios, esto sería útil si funcionó como dicen todos los tutoriales. Creo que esto es de una versión muy antigua de la API de Android ...

Es posible que desee considerar la sustitución del método de un WebChromeClientonProgressChanged como aquí: How to listen for a WebView finishing loading a URL?o el método de la WebViewClientonPageFinished().

+0

Ah, gracias. Usaré el anterior en todo caso, ya que la devolución de llamada solo muestra una pantalla de error 404, preferiría que no termine de cargar la página. Gracias un montón. – Justin

+2

OnPageFinished no funciona de manera confiable para mí, pero en ProgressChanged sí. Probé esto imprimiendo un mensaje de registro con el progreso en onPageFinished y noté que el progreso no siempre era 100 cuando se llama a onPageFinished. De acuerdo con la documentación de Android sobre onPageFinished, "Este método se llama solo para el marco principal", por lo que no creo que sea confiable utilizar este método para saber si la página realmente se cargó por completo. –

+1

re 2. Esto ha cambiado con el método API 24: 'shouldOverrideUrlLoading (vista WebView, solicitud WebResourceRequest)' también se llama para los redireccionamientos pero con 'request.isRedirect()' puede controlar lo que desee – hmac

13

He encontrado lo que creo que es una forma razonable de hacer esto gracias a la respuesta anterior y los comentarios que me apuntan en la dirección correcta.

Lo que hice fue anular onPageStarted y onPageFinished en un WebViewClient personalizado. El código es algo como esto ...

@Override 
public void onPageStarted(WebView view, String url, Bitmap favicon) { 
    if (pendingUrl == null) { 
    pendingUrl = url; 
    } 
} 

@Override 
public void onPageFinished(WebView view, String url) { 
    if (!url.equals(pendingUrl)) { 
    Log.d(TAG, "Detected HTTP redirect " + pendingUrl + "->" + url); 
    pendingUrl = null; 
    } 
} 

Y, por supuesto, junto con el Log.d que pondría cualquier código específico que desea ejecutar al detectar la redirección.

+3

Estas son funciones de una costumbre * WebViewClient *, no de * WebChromeClient *, por si acaso alguien tropieza con este – Till

+0

He editado la respuesta para referirme a WebViewClient en lugar de WebChromeClient –

Cuestiones relacionadas