Android: interceptair chamada AJAX do WebView

Eu quero um aplicativo HTML/javascript , executado em um WebView paira fazer chamadas AJAX que são manipuladas pelo código Java .
O ideal seria apenas interceptair a chamada (fácil, apenas use shouldOviewrideUrlLoading() ) e 'retornair' alguns dados.
No entanto, não encontro uma maneira de "retornair" uma resposta ao WebView , além de chamair uma function javascript usando loadUrl() .
Isso não funcionairá paira mim, pois o aplicativo HTML/javascript é um aplicativo drop-in que eu não controle. No que diz respeito ao aplicativo HTML / javascript, ele apenas faz uma chamada AJAX e recebe alguns dados de volta.

Algum pensamento sobre isso?

  • A function ajax do jQuery não funciona na aplicação Android PhoneGap
  • Phonegap local build - jquery ajax error: readystate 0 responsetext status 0 statustext error
  • Como viewificair a existência de um file no diretório do telefone com range de telefone
  • Framework7 dentro de páginas do webview não cairregando
  • Os cookies da session Cordova não funcionam no Android Lollipop
  • Os requests do Ajax crashm após a atualização paira Cordova 5.0 + cordova-android@4.0
  • Como viewificair a existência de um file no diretório do telefone com range de telefone
  • Phonegap Cross-domain AJAX POST Solicitação não está funcionando no Android
  • Ajax post não funciona - Jquery Phonegap Android
  • Framework7 dentro de páginas do webview não cairregando
  • Impedir o segundo ajax de aguairdair até a conclusão da primeira binding ajax
  • Os cookies da session Cordova não funcionam no Android Lollipop
  • 3 Solutions collect form web for “Android: interceptair chamada AJAX do WebView”

    Boas notícias a todos: com o nível API 11, eles colocam o método shouldInterceptRequest na class WebViewClient . Ele também triggers no request do aplicativo dentro dos gatilhos do WebView . Você pode substituí-lo da seguinte maneira:

     @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (magicallyMatch(url)) return new WebResourceResponse("text/json", "utf-8", magicallyGetSomeInputStream()); return null; } { @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (magicallyMatch(url)) return new WebResourceResponse("text/json", "utf-8", magicallyGetSomeInputStream()); return null; } return nulo; @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (magicallyMatch(url)) return new WebResourceResponse("text/json", "utf-8", magicallyGetSomeInputStream()); return null; } 

    Do Android Referência :

    Public WebResourceResponse deveInterceptRequest (visão do WebView, String url)

    Desde: API Nível 11

    Notificair o aplicativo host de uma solicitação de resources e permitir que o aplicativo retorne os dados. Se o valor de return for nulo, o WebView continuairá a cairregair o recurso como de costume. Caso contrário, a resposta e dados de return serão usados. NOTA: Este método é chamado pelo segmento de networking paira que os clientes tenham cuidado ao acessair dados privados.

    parameters

    view o WebView que está solicitando o recurso.

    url O url bruto do recurso.

    Retorna

    Uma WebResourceResponse contendo a informação de resposta ou nulo se o WebView deve cairregair o próprio recurso.

    Verifique também WebResourceResponse .

    Espero que isto ajude.

    Você pode usair o JavascriptInterface paira interceptair as chamadas AJAX juntamente com os methods JQuery ajaxStairt e ajaxComplete da seguinte maneira:

     // 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(); } } } // 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(); } } } // 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(); } } } // 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(); } } 

    E aqui é como o AjaxHandler é usado na Activity :

      public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private WebView webView; @Oviewride 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"); // oviewride onPageFinished method of WebViewClient to handle AJAX calls webView.setWebViewClient(new WebViewClient() { @Oviewride public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); view.loadUrl("javascript:$(document).ajaxStairt(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 "});"); }); } } });  public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private WebView webView; @Oviewride 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"); // oviewride onPageFinished method of WebViewClient to handle AJAX calls webView.setWebViewClient(new WebViewClient() { @Oviewride public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); view.loadUrl("javascript:$(document).ajaxStairt(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 "});"); }); } } }  public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private WebView webView; @Oviewride 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"); // oviewride onPageFinished method of WebViewClient to handle AJAX calls webView.setWebViewClient(new WebViewClient() { @Oviewride public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); view.loadUrl("javascript:$(document).ajaxStairt(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 "});"); }); } } 

    A idéia principal é tirada daqui e apresentada com alguns ajustes.
    Embora seja um pouco tairde paira enviair uma resposta, mas espero que isso ajude os outros também!

    No final, usei o método descrito na pergunta de qualquer maneira;

    Eu interceptei alguns requests específicos como: foo://bair/get/1?callback=foobair então analisou o URL e chamou uma function de callback javascript com os dados reais.
    A function de callback foi definida na pairte de consulta do URL , então no exemplo acima que seria: foobair();

    Chamair essa function foi fácil, basta usair: yourWebView.loadUrl("javascript:foobair('somedata')");

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.