У меня есть HTML5/javascript файлы, размещенные на сервере. При нажатии кнопки на странице HTML5 вызывается функция javascript. Я хочу слушать, когда вызывается функция, и передайте функцию json, возвращаемую функцией. Раньше я открывал порт на устройстве, но, похоже, он не работает на Android 3.0. Я слышал, что вы можете использовать внешний интерфейс для прослушивания javascript-вызовов, но я не знаю, как это реализовать.Слушайте вызов функции javascript из java - Android
ответ
Для использования внешних интерфейсов вам необходимо запустить свой сайт в WebView. Также следующее решение подразумевает то, что
- вы знаете имена всех функций, которые вы хотите перехватывать, и ...
- этих функций в общественном объеме 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');");
}
}
});
Привет, Может у вас немного подробнее об этой функции 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
да ... я запускаю свою страницу в webview, и я знаю имена функций, которые я хочу перехватить, и да, они находятся в общедоступной области js-кода. – Vibhuti
Я добавил полное решение. Если ситуация не станет более ясной, задайте конкретный вопрос, пожалуйста. – Olegas
я сделал по-другому, и она работала easily.I используется window.external.notify (String сообщение). В моей java я использовал webview.addJavascriptInterface (новый JSInterface(), «внешний»); и в моем классе JSInterface я сделал функцию public void notify (String messg). messg содержит мой ответ от javascript.
- 1. вызов функции javascript из android
- 2. Вызов функции Java из JavaScript
- 3. Вызов функции Javascript с Android
- 4. Android: вызов функции в java из переменных перехода javascript
- 5. Вызов функции Java из JavaScript через Android WebView
- 6. Слушайте обратный вызов из API?
- 7. GWT: вызов функции javascript из Java
- 8. Вызов функции javascript из Java (Groovy) класс
- 9. Вызов внутренней функции javascript из java-кода
- 10. Вызов функции Javascript из класса Java
- 11. Вызов функции GWT Java из JavaScript
- 12. Вызов функции javascript из веб-сайта android?
- 13. Вызов функции MongoDB из Java
- 14. Вызов функции Javascript из json
- 15. Вызов функции Java из Unity3D
- 16. вызов функции VB.net из javascript
- 17. Android: Проблема в Вызов JavaScript функции
- 18. Вызов класса java из javascript
- 19. Вызов функции возвращаемого значения javascript из активности android
- 20. Xamarin - вызов функции Android с помощью JavaScript
- 21. Вызов функции Javascript из Perl
- 22. Вызов функции боба из JavaScript
- 23. Вызов функции ASP.Net из javascript
- 24. Вызов функции C# из javascript
- 25. Вызов функции Javascript из ascx
- 26. вызов функции ajax из javascript
- 27. Вызов функции Javascript из href
- 28. Вызов функции Javascript из строки
- 29. Вызов функции JavaScript из PHP
- 30. Вызов функции JavaScript из сервлета
Вы используете свою страницу в WebView? – Olegas