2010-10-15 2 views
14

Desidero un'applicazione HTML/javascript, in esecuzione in un WebView per effettuare chiamate AJAX gestite dal codice Java.
ideale sarebbe quello di intercettare solo la chiamata (facile, basta usare shouldOverrideUrlLoading()) e 'ritorno' alcuni dati.
Tuttavia, non riesco a trovare un modo per "restituire" una risposta allo WebView, oltre a chiamare una funzione javascript utilizzando loadUrl().
questo non funziona per me, come l'applicazione HTML/javascript è un drop-in software che io non controllo. Per quanto riguarda l'app HTML/javascript, fa semplicemente una chiamata AJAX e riceve alcuni dati indietro.Android: Intercetta chiamata AJAX da WebView

Qualche idea su questo?

+0

può ottenere una risposta ajax dopo aver inviato i dati del modulo? visualizza la pagina web in webview dall'URL remoto –

risposta

2

Alla fine ho usato il metodo descritto nella domanda comunque;

Ho intercettato alcune richieste specifiche come: foo://bar/get/1?callback=foobar quindi analizzato il URL e chiamato una funzione di callback javascript con i dati effettivi.
La funzione di callback è stata definita nella query-parte del URL, quindi nell'esempio di cui sopra sarebbe: foobar();

da visita che la funzione è stato facile, basta usare: yourWebView.loadUrl("javascript:foobar('somedata')");

+0

Erik puoi elaborare, come hai sovraccaricatoURL per la gestione delle richieste AJAX e anche dirmi come gestire la richiesta AJAX da Java .. anche io non conosco il meccanismo di intercettazione delle chiamate ... im intrappolato nello stesso problema ... Aiuto necessario .. Grazie – jyotin

31

Buone notizie a tutti: Con API livello 11, inseriscono il metodo shouldInterceptRequest nella classe WebViewClient. Inoltre, attiva le richieste dell'applicazione all'interno dei trigger WebView. È possibile ignorare come segue:

@Override 
public WebResourceResponse shouldInterceptRequest(WebView view, String url) 
{ 
    if (magicallyMatch(url)) 
     return new WebResourceResponse("application/json", "utf-8", magicallyGetSomeInputStream()); 

    return null; 
} 

Dal Android Reference: WebResourceResponse pubblico

shouldInterceptRequest (vista WebView, String url)

Dal: Livello API 11

Notifica l'applicazione host di una richiesta di risorsa e consentire il applicazione per restituire i dati . Se il valore di ritorno è nullo, il WebView continuerà per caricare la risorsa come al solito. In caso contrario, verrà utilizzata la risposta di ritorno e i dati. NOTA: Questo metodo viene chiamato dal thread rete in modo i clienti dovrebbero Fare attenzione quando si accede dati privati.

Parametri

view Il WebView che richiede la risorsa.

url L'url grezzo della risorsa.

Returns

A WebResourceResponse contenente le informazioni risposta o null se il WebView dovrebbe caricare la risorsa stesso.

Controllare anche WebResourceResponse.

Spero che questo aiuti.

+0

Questo dovrebbe essere contrassegnato come la risposta corretta. –

+1

Non c'è modo di farlo funzionare su telefoni che non hanno 3.x? – NoBugs

+1

può ottenere una risposta ajax dopo aver inviato i dati del modulo? visualizza la pagina web in webview dall'URL remoto –

10

È possibile utilizzare il JavascriptInterface per intercettare il chiamate AJAX con i metodi JQuery ajaxStart e ajaxComplete in modo seguente:

// our JavascriptInterface 
public class AjaxHandler { 

    private static final String TAG = "AjaxHandler"; 
    private final Context context; 

    public AjaxHandler(Context context) { 
     this.context = context; 
    } 

    public void ajaxBegin() { 
     Log.w(TAG, "AJAX Begin"); 
     Toast.makeText(context, "AJAX Begin", Toast.LENGTH_SHORT).show(); 
    } 

    public void ajaxDone() { 
     Log.w(TAG, "AJAX Done"); 
     Toast.makeText(context, "AJAX Done", Toast.LENGTH_SHORT).show(); 
    } 
} 

Ed ecco come gli AjaxHandler è usato in Activity:

public class MainActivity extends Activity { 

    private static final String TAG = "MainActivity"; 

    private WebView webView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     // get web view 
     webView = (WebView) findViewById(R.id.web); 

     // configure web view 
     final WebSettings webSettings = webView.getSettings(); 
     webSettings.setBuiltInZoomControls(true); 
     webSettings.setJavaScriptEnabled(true); 

     webView.loadUrl("http://foo.com"); 

     // add javascript interface 
     webView.addJavascriptInterface(new AjaxHandler(this), "ajaxHandler"); 

     // override onPageFinished method of WebViewClient to handle AJAX calls 
     webView.setWebViewClient(new WebViewClient() { 

       @Override 
       public void onPageFinished(WebView view, String url) { 
        super.onPageFinished(view, url); 

        view.loadUrl("javascript:$(document).ajaxStart(function (event, request, settings) { " + 
          "ajaxHandler.ajaxBegin(); " + // Event called when an AJAX call begins 
          "});"); 
        view.loadUrl("javascript:$(document).ajaxComplete(function (event, request, settings) { " + 
          "ajaxHandler.ajaxDone(); " + // Event called when an AJAX call ends 
          "});"); 

      }); 
    } 
} 

L'idea principale è presa da here e presentata con alcune modifiche.
Anche se è un po 'tardi per inviare una risposta, ma spero che questo aiuti anche gli altri!

+0

È un'ottima soluzione. Ma come posso ottenere i parametri di richiesta in AjaxHandler dal codice js? –

+1

Ottima soluzione, grazie. Inoltre, voglio solo sapere che ajaxStop potrebbe essere migliore in questo caso perché viene attivato quando l'ajax interrompe effettivamente il caricamento. fonte: http://stackoverflow.com/a/4421115/706833 – iGoDa

+0

@ S1LENT WARRIOR Ho messo il codice così com'è ma qualsiasi risposta di Toast non –