Как мы можем выполнить функцию javascript и получить возвращаемое значение в нашем приложении для Android?

Как мы можем выполнить функцию javascript и получить возвращаемое значение в нашем андроидном приложении?

Мы хотим выполнить javascript на событии нажатия кнопки, нам нужно передать параметры сценарию и получить возвращаемые значения. Поэтому мы используем «WebChromeClient» для реализации этого, но мы получили исключение: «SyntaxError: ошибка синтаксического анализа в undefined: 1 "

Следующий мой код

import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; public class FirstTab extends Activity { private WebView webView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.regis); try{ webView = (WebView) findViewById(R.id.webView1); webView.getSettings().setJavaScriptEnabled(true); webView.setWebChromeClient(new MyWebChromeClient()); String customHtml = "<html><head><title>iSales</title><script type=\"text/javascript\"> function fieldsOnDelete(){ var x=123; return \"JIJO\"; } </script></head><body>hi</body></html>"; webView.loadData(customHtml, "text/html","UTF-8"); }catch(Exception e) { Log.v("JAC LOG",e.toString()); } } public void onResume() { super.onResume(); final Button button = (Button) findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try{ webView.loadUrl("javascript:alert(javascript:fieldsOnDelete())"); } catch(Exception e) { Log.v("JAC LOG",e.toString()); } } }); } final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.v("LogTag", message); result.confirm(); return true; } } } 

Вы можете использовать mWebView.loadUrl("javascript:checkName"); Вызвать метод …

Затем вы можете использовать addJavascriptInterface() чтобы добавить объект Java в среду Javascript. Попросите свой Java-скрипт вызвать метод на этом объекте Java для предоставления его «возвращаемого значения».

EDIT1: Или вы можете использовать следующий хак:

Добавьте этого клиента в свой WebView:

 final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d("LogTag", message); result.confirm(); return true; } } 

Теперь в вашем вызове java-скрипта выполните:

 webView.loadUrl("javascript:alert(functionThatReturnsSomething)"); 

Теперь в onJsAlert вызов « message » будет содержать возвращаемое значение.

Edit2:

Таким образом, это не работает, если мы вызываем метод javascript сразу после вызова для загрузки URL-адреса, так как загрузка страницы занимает некоторое время. Поэтому я создал тестовую программу для тестирования этого …

Ниже приведен мой файл html (named test.html) в папке с ресурсами:

 <html> <head> <script language="javascript"> function fieldsOnDelete(message) { alert("i am called with " + message); window.myjava.returnValue(message + " JIJO"); } </script> <title>iSales android</title> </head> <body></body> </html> </body> </html> 

Ниже приведен мой класс java, который получит, что я добавлю скрипт java в качестве интерфейса, и он получит возвращаемое значение:

 public class MyJS { public void returnValue(String string){ Log.d(this.getClass().getSimpleName(), string); } } 

И следующий мой класс активности:

 public class CheckWebView extends Activity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_check_web_view); webView = (WebView) findViewById(R.id.webview); webView.setWebChromeClient(new WebChromeClient() { @Override public void onConsoleMessage(String message, int lineNumber, String sourceID) { super.onConsoleMessage(message, lineNumber, sourceID); Log.d(this.getClass().getCanonicalName(), "message " + message + " :::line number " + lineNumber + " :::source id " + sourceID); } @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { // TODO Auto-generated method stub onConsoleMessage(consoleMessage.message(), consoleMessage.lineNumber(), consoleMessage.sourceId()); Log.d(this.getClass().getCanonicalName(), "message::::: " + consoleMessage.message()); return super.onConsoleMessage(consoleMessage); } }); webView.addJavascriptInterface(new MyJS(), "myjava"); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setPluginsEnabled(true); webView.getSettings().setAllowFileAccess(true); webView.loadUrl("file:///android_asset/test.html"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_check_web_view, menu); return true; } /* (non-Javadoc) * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem) */ @Override public boolean onOptionsItemSelected(MenuItem item) { webView.loadUrl("javascript:fieldsOnDelete('name');"); return super.onOptionsItemSelected(item); } } 

Ключ здесь заключается в том, что между вызовом для загрузки html-файла из папки с данными и вызовом javascript:method должен быть некоторый промежуток времени. Здесь я onOptionsItemSelected его из onOptionsItemSelected и он отлично работает. Если я webView.loadUrl("javascript:fieldsOnDelete('name');"); До конца метода onCreate () он показывает ошибку, что он не может найти fieldsOnDelete() метод …

Надеюсь, поможет…

EDIT3:

Замените в своем коде следующее

 webView.loadUrl("javascript:alert(javascript:fieldsOnDelete())"); 

с

 webView.loadUrl("javascript:alert(fieldsOnDelete())"); 

и попробовать…

В Android KitKat существует новый метод оценки JavaScript, который имеет обратный вызов для возвращаемого значения. Обратный вызов возвращает значение JSON, объект или массив в зависимости от того, что вы возвращаете.

  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // In KitKat+ you should use the evaluateJavascript method mWebView.evaluateJavascript(javascript, new ValueCallback<String>() { @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public void onReceiveValue(String s) { JsonReader reader = new JsonReader(new StringReader(s)); // Must set lenient to parse single values reader.setLenient(true); try { if(reader.peek() != JsonToken.NULL) { if(reader.peek() == JsonToken.STRING) { String msg = reader.nextString(); if(msg != null) { Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show(); } } } } catch (IOException e) { Log.e("TAG", "MainActivity: IOException", e); } finally { try { reader.close(); } catch (IOException e) { // NOOP } } } }); } 

Вы можете увидеть полный пример здесь: https://github.com/GoogleChrome/chromium-webview-samples/tree/master/jsinterface-example