Вызов функции Java из JavaScript через Android WebView
Я хочу сделать синхронный вызов некоторого кода Java в моем приложении для Android.
Я использую это решение:
https://stackoverflow.com/a/3338656
мой Java-код:
final class MyWebChromeClient extends WebChromeClient {
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d("LogTag", message);
result.confirm();
return true;
}
}
мой код JavaScript:
<html>
<script>
function java_request(){
alert('test');
}
</script>
<body>
<h2>Welcome</h2>
<div id="area"></div>
<form>
<input type="button" value="java_call" onclick="java_request()">
</form>
</body>
</html>
когда я нажимаю на java_call кнопка, кнопка переходит в нажатое состояние. Я вижу 'test' в журнале консоли. До сих пор все нормально.
проблема в том, что кнопка не возвращается в нормальное состояние. Оно остается в нажатом состоянии. Может быть, выполнение JavaScript сломано или что-то еще?
Почему кнопка никогда не возвращается в нормальное состояние?
3 ответов:
Я не думаю, что это лучшее решение, чтобы получить javascript для выполнения кода java. Смотрите здесь:
если вы хотите предоставить собственный код HTML для вызова с помощью javascript, выполните следующие действия вокруг объявления веб-представления:
JavaScriptInterface jsInterface = new JavaScriptInterface(this); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(jsInterface, "JSInterface");объявить класс
JavaScriptInterface:public class JavaScriptInterface { private Activity activity; public JavaScriptInterface(Activity activity) { this.activity = activity; } public void startVideo(String videoAddress){ Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(videoAddress), "video/3gpp"); activity.startActivity(intent); } }Я объявляю одну функцию для воспроизведения видео, но вы можете делать все что угодно.
наконец-то вы называете это
WebViewсодержание через простой вызов javascript:<video width="320" height="240" controls="controls" poster='poster.gif' onclick="window.JSInterface.startVideo('file:///sdcard/test.3gp');" > Your browser does not support the video tag. </video>пример взят из другого моего ответа, о воспроизведении видео, но должен быть достаточно объяснения.
EDIT согласно комментарию @CedricSoubrie: если целевая версия приложения установлена на 17 или выше, вам нужно добавить аннотацию
@JavascriptInterfaceнад каждым методом, который вы хотите экспортировать в веб-представление.
ваша функция возвращает 'true'. Это делает свойство "onclick" вашего HTML-кода равным true, поэтому кнопка остается нажатой.-
методы, определенные в "YourJavaScriptInterface" класс, не забудьте аннотировать каждый метод, который вы хотите предоставить с помощью "@JavascriptInterface", иначе метод не будет запущен.
например, приведенный ниже код из интерфейса Google Cloud Print JavaScript для вызовов со страницы webview:
final class PrintDialogJavaScriptInterface { @JavascriptInterface public String toString() { return JS_INTERFACE; } @JavascriptInterface public String getType() { return cloudPrintIntent.getType(); } @JavascriptInterface public String getTitle() { return cloudPrintIntent.getExtras().getString("title"); } @JavascriptInterface public String getContent() { try { ContentResolver contentResolver = getActivity().getContentResolver(); InputStream is = contentResolver.openInputStream(cloudPrintIntent.getData()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int n = is.read(buffer); while (n >= 0) { baos.write(buffer, 0, n); n = is.read(buffer); } is.close(); baos.flush(); return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ""; } @JavascriptInterface public String getEncoding() { return CONTENT_TRANSFER_ENCODING; } @JavascriptInterface public void onPostMessage(String message) { if (message.startsWith(CLOSE_POST_MESSAGE_NAME)) { finish(); } } }
Comments