Intereting Posts

Android: перехват вызова AJAX из WebView

Я хочу, чтобы приложение HTML/javascript , работающее в WebView вызовы AJAX , которые обрабатываются кодом Java .
Идеально было бы просто перехватить вызов (просто, просто используйте shouldOverrideUrlLoading() ) и «вернуть» некоторые данные.
Тем не менее, я не нахожу способ «вернуть» ответ на WebView , кроме вызова функции javascript с помощью loadUrl() .
Это не сработает для меня, так как приложение HTML/javascript – это приложение, которое я не контролирую. Что касается приложения HTML / javascript, он просто выполняет вызов AJAX и возвращает некоторые данные.

Любые мысли об этом?

Solutions Collecting From Web of "Android: перехват вызова AJAX из WebView"

Хорошая новость: с API уровня 11 они shouldInterceptRequest метод WebViewClient класс WebViewClient . Он также запускает запросы приложения внутри триггеров WebView . Вы можете переопределить его следующим образом:

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

Из справочника Android :

Public WebResourceResponse shouldInterceptRequest (представление WebView, строковый URL)

С: API уровня 11

Уведомлять хост-приложение запроса ресурса и разрешать приложению возвращать данные. Если возвращаемое значение равно нулю, WebView продолжит загрузку ресурса, как обычно. В противном случае будут использоваться ответ возврата и данные. ПРИМЕЧАНИЕ. Этот метод вызывается сетевым потоком, поэтому клиенты должны проявлять осторожность при доступе к личным данным.

параметры

view WebView , запрашивающий ресурс.

url Необработанный URL ресурса.

Возвращает

A WebResourceResponse содержащий информацию об ответе или null, если WebView должен загрузить сам ресурс.

Также проверьте WebResourceResponse .

Надеюсь это поможет.

Вы можете использовать JavascriptInterface для перехвата вызовов AJAX вместе с методами JQuery ajaxStart и ajaxComplete следующим образом:

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

И вот как AjaxHandler используется в AjaxHandler :

  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 "});"); }); } } 

Основная идея взята здесь и преподнесена с некоторыми ухищрениями.
Хотя его немного поздно подать ответ, но надеюсь, что это тоже поможет другим!

В конце концов я использовал метод, описанный в вопросе;

Я перехватил некоторые конкретные запросы, такие как: foo://bar/get/1?callback=foobar затем проанализировал URL и вызвал функцию обратного вызова javascript с фактическими данными.
Функция обратного вызова была определена в части запроса URL , поэтому в приведенном выше примере это будет: foobar();

Вызов этой функции был простой, просто используйте: yourWebView.loadUrl("javascript:foobar('somedata')");