Android: intercepte l'appel AJAX depuis WebView

Je veux une application HTML/javascript , exécutée dans un WebView pour effectuer AJAX appels AJAX gérés par le code Java .
L'idéal serait de simplement intercepter l'appel (facile, utilisez simplement shouldOverrideUrlLoading() ) et "retourner" certaines données.
Cependant, je ne trouve pas un moyen de "retourner" une réponse à la WebView , autrement que d'appeler une fonction javascript utilisant loadUrl() .
Cela ne fonctionnera pas pour moi, car l'application HTML/javascript est une application déroulante que je ne contrôle pas. En ce qui concerne l'application HTML / javascript, il s'agit simplement d'un appel AJAX et reçoit certaines données.

Des pensées à ce sujet?

  • Android CAB détruisant après listview notifydatasetchanged
  • Android: comment partager l'image avec le texte sur facebook via l'intention?
  • Assurer la communication avec une application mobile?
  • Android - show / hide fragment laisse une zone vide
  • Quels intentos appuie l'application Android Facebook
  • Commutez l'utilisateur ou ré-authentifiez-vous avec Instagram
  • Empêcher le deuxième appel ajax d'attendre jusqu'à la fin du premier appel ajax
  • Les requêtes Ajax échouent après la mise à niveau vers Cordova 5.0 + cordova-android@4.0
  • JQuery Mobile ne fonctionne pas sous javascript secondaire
  • Comment vérifier l'existence d'un fichier dans l'annuaire téléphonique avec le partage de téléphone
  • Phonegap Cross-domain AJAX POST Demande ne fonctionne pas sur Android
  • Comment afficher / déboguer les en-têtes de requêtes non standard que le navigateur de mon téléphone envoie?
  • 3 Solutions collect form web for “Android: intercepte l'appel AJAX depuis WebView”

    Bonne nouvelle: avec le niveau API 11, ils mettent la méthode shouldInterceptRequest dans la classe WebViewClient . Il se déclenche également sur les demandes de la demande dans les déclencheurs WebView . Vous pouvez l'annuler comme suit:

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

    À partir de la référence Android :

    Public WebResourceResponse shouldInterceptRequest (vue WebView, chaîne url)

    Depuis: API Niveau 11

    Notifier l'application hôte d'une demande de ressources et permettre à l'application de retourner les données. Si la valeur de retour est nulle, la WebView continuera de charger la ressource comme d'habitude. Sinon, la réponse et les données de retour seront utilisées. REMARQUE: cette méthode est appelée par le fil du réseau afin que les clients soient vigilants lors de l'accès aux données privées.

    Paramètres

    WebView The WebView qui demande la ressource.

    url L' url brute de la ressource.

    Résultats

    Une réponse WebResourceResponse contenant les informations de réponse ou null si la WebView doit charger la ressource elle-même.

    Vérifiez également WebResourceResponse .

    J'espère que cela t'aides.

    Vous pouvez utiliser le JavascriptInterface pour intercepter les appels AJAX avec les méthodes JQuery ajaxStart et ajaxComplete de la façon suivante:

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

    Et voici comment l' AjaxHandler est utilisé dans 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'idée principale est prise ici et présente quelques ajustements.
    Bien qu'il soit un peu en retard pour soumettre une réponse, mais j'espère que cela aide les autres aussi!

    À la fin, j'ai utilisé la méthode décrite dans la question de toute façon;

    J'ai intercepté certaines requêtes spécifiques comme: foo://bar/get/1?callback=foobar ensuite analysé l' URL et appelé une fonction de rappel de javascript avec les données réelles.
    La fonction de rappel a été définie dans la partie requête de l' URL , donc dans l'exemple ci-dessus qui serait: foobar();

    L'appel de cette fonction était simple, utilisez simplement: yourWebView.loadUrl("javascript:foobar('somedata')");

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.