2012-02-16 3 views
3

У меня есть HTML5/javascript файлы, размещенные на сервере. При нажатии кнопки на странице HTML5 вызывается функция javascript. Я хочу слушать, когда вызывается функция, и передайте функцию json, возвращаемую функцией. Раньше я открывал порт на устройстве, но, похоже, он не работает на Android 3.0. Я слышал, что вы можете использовать внешний интерфейс для прослушивания javascript-вызовов, но я не знаю, как это реализовать.Слушайте вызов функции javascript из java - Android

+0

Вы используете свою страницу в WebView? – Olegas

ответ

3

Для использования внешних интерфейсов вам необходимо запустить свой сайт в WebView. Также следующее решение подразумевает то, что

  1. вы знаете имена всех функций, которые вы хотите перехватывать, и ...
  2. этих функций в общественном объеме JS кода.

Для регистрации интерфейса вам необходимо позвонить по методу addJavascriptInterface на свой случай WebView. Вам нужно выбрать имя для него и создать реализацию. Ваш интерфейс должен перехватывать вызовы функций и сообщать о своих результатах, поэтому давайте описать ...

class FunctionCallInterceptor { 
    public void reportCall(String functionName, String result) { 
     // some code, handling interception 
    } 
} 

и зарегистрировать его ...

mWebView.addJavascriptInterface(new FunctionCallInterceptor(), 'Interceptor'); 

Для получения дополнительной информации по интерфейсу JavaScript см Binding JavaScript

Тогда вам нужно «передать» результаты функции вашему интерфейсу ... Здесь вам нужен код JavaScript.

function wrapFunc(name) { 
    if(typeof window[name] == 'function') { // If target is accessible 
    var original = window['__' + name] = window[name]; // remember original one 
    window[name] = function() { // and replace with wrapper 
     var result = original.apply(this, arguments); // call original     
     Interceptor.reportCall(name, result.toString()); // report to interceptor 
     return result; // return result as usual 
    } 
    } 
} 

обернуть использование функции этот код

wrapFunc('myFunction'); // wraps myFunction in the source 

Кроме того, не забудьте включить JavaScript на всех

mWebView.getSettings().setJavaScriptEnabled(true); 

Когда, как встроить этот код на свою внешнюю страницу (Я подразумеваю, что у вас нет доступа к внешнему JS-коду) ... Для выполнения произвольного кода в контексте страницы вы можете использовать метод loadUrlWebView

mWebView.loadUrl('javascript:some... js... code...'); 

Это не приведет к перезагрузке страницы, просто будет выполнен JavaScript. Обратите внимание, что вам нужно выполнить это после полной загрузки страницы. Вы можете получить это с помощью кода ниже:

mWebView.setWebViewClient(new WebViewClient { 
    @Override 
    public void onPageFinished (WebView view, String url) { 
     // here page is loaded 
    } 
}); 

См setWebViewClient и onPageFinished Подробности

Также обратите внимание, какой код, переносится на страницу с помощью loadUrl вызова, не должны содержать разрывы строк. Поэтому вам нужно избавиться от них (по String.replace или так).

ADD Таким образом, окончательное решение:

String wrapFuncCode = "function wrapFunc ...... "; // or maybe place it in resources? 
mWebView.addJavascriptInterface(new FunctionCallInterceptor(), 'Interceptor'); 
mWebView.getSettings().setJavaScriptEnabled(true); 
mWebView.setWebViewClient(new WebViewClient { 
    @Override 
    public void onPageFinished (WebView view, String url) { 
     // inject wrapper 
     // don't forget to remove newline chars 
     mWebView.loadUrl("javascript:" + wrapFuncCode.replace('\n', '')); 

     // wrap all the functions needed 
     String[] funcToWrap = new String[] { 'myFunc1', ... }; 
     for(String f : funcToWrap) { 
      mWebView.loadUrl("javascript:wrapFunc('" + f + "myFunction');"); 
     } 
    } 
}); 
+0

Привет, Может у вас немного подробнее об этой функции wrapFunc (name) { if (typeof window [name] == 'function') {// Если цель доступна var original = window ['__' + name] = окно [имя]; // запомнить оригинал window [name] = function() {// и заменить оболочкой var result = original.apply (this, arguments); // вызов оригинала Interceptor.reportCall (имя, result.toString()); // сообщение перехватчику результат возврата; // возвращаем результат как обычно } } } и wrapFunction ('myFunction'); Где я могу добавить этот фрагмент кода? – Vibhuti

+0

да ... я запускаю свою страницу в webview, и я знаю имена функций, которые я хочу перехватить, и да, они находятся в общедоступной области js-кода. – Vibhuti

+0

Я добавил полное решение. Если ситуация не станет более ясной, задайте конкретный вопрос, пожалуйста. – Olegas

2

я сделал по-другому, и она работала easily.I используется window.external.notify (String сообщение). В моей java я использовал webview.addJavascriptInterface (новый JSInterface(), «внешний»); и в моем классе JSInterface я сделал функцию public void notify (String messg). messg содержит мой ответ от javascript.

+0

Это тот же подход. – Olegas

+0

Да. Я получил это. – Vibhuti

Смежные вопросы