Я делаю приложение для Android с помощью веб-просмотра. Приложение может распечатывать чеки. Что я хочу сделать, так это когда принтер не работает, появляется окно предупреждения, чтобы сообщить, что принтер не работает, и возвращать false в событие onsubmit формы, чтобы предотвратить отправку формы.
Код Java:
public class JSKicker {
@JavascriptInterface
public void callPrint(final String argumet) {
Thread thread = new Thread(new Runnable() {
public void run() {
int nRtn;
connectionNum = myPrinter.Connect("000.000.0.000");
if (connectionNum < 0){ //Printer not working
webview.post(new Runnable() {
@Override
public void run() {
String script = "alert('Printer Error'); return printer_connection = false;";
webview.evaluateJavascript(script, new ValueCallback<String>() {
@Override
// I can't figure out what to do here...
});
}
});
}else{ //Printer is working properly
connectionNum = myPrinter.SetLocale(8);
strText = argument;
nRtn = myPrinter.PrintText(strText, "SJIS");
nRtn = myPrinter.PaperFeed(64);
nRtn = myPrinter.CutPaper(1);
myPrinter.Disconnect();
}
}
});
thread.start();
}
JavaScript в заголовке:
<script type = "text/javascript">
function gate(){
jQuery.ajax({
url:'/cart_info.php',
type:'GET'
})
.done( (data) => {
window.JSKicker.callPrint(data);
})
if (printer_connection = false) {
return false;
}else{
return true;
}
}
</script>
Тег HTML-формы:
<form method = "post" id = "order_form" onsubmit = "return gate();">
Как мне получить эту работу?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Могли бы вы сделать это через WebView.evaluateJavascript ()?
Таким образом, вы можете отправить простой CustomEvent в документ в WebView
webView.evaluateJavascript("document.dispatchEvent(new Event('printer_error', { details: "No printer found!" }));");
а в JavaScript вы можете подключить прослушиватель для реакции вашего пользовательского события.
document.addEventListener('printer_error', e => alert(e.details));
Не проверял это, так что может быть, по крайней мере, для оценкиJavascript () требуется функция обратного вызова.
С таким же подходом вы можете делать любые действия на своей странице. Например. document.addEventListener ('submit_form', e => document.getElementById ('my-form'). submit ()) будет самым простым способом. Проверить w3schools.com/jsref/met_form_submit.asp
WebSocket может решить вашу проблему.
WebSockets обеспечивают постоянное соединение между клиентом и сервером, которое обе стороны могут использовать для начала отправки данных в любое время. Клиент устанавливает соединение WebSocket посредством процесса, известного как рукопожатие WebSocket.
Его очень просто и легко реализовать.
Вы можете перейти по ссылкам реферера для получения более подробной информации: -
JAVA WebSocket: - WebSocket с использованием Spring Boot, WebSocket с использованием Simple JEE
Браузер WebSocket (JavaScript): - WebSocket API
В Android, если вы хотите, чтобы веб-просмотр передавал значение в JavaScript. Во-первых, вам нужно настроить веб-просмотр, чтобы включить JavaScript,
private WebView mWebView;
void onCreate(){
mWebView = findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
}
И, если вы хотите что-то сделать, код
if (connectionNum < 0){ //Printer not working
// I need to do something here to send a message that the printer isn't working to JS.
//In thread can not use mWebView,should send message to MainThread to do
// mWebView.loadUrl("javascript:javaCall()");
Message msg = new Message();
msg.what = 1;
myHandler.sendMessage(msg);
//myHandler can be your MainThread send to here
}
И если mWebView, созданный в вашем коде, находится в основном потоке, вы можете использовать Обработчик сообщения, отправленного сюда.
private Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// this 1 is just thread send to here
if (msg.what == 1) {
//and here can do the webview UI method
mWebView.loadUrl("javascript:javaCall()");
}
}
};
javaCall () - это то место, где вы вызываете метод JacaScript, в javaScript вы можете написать так:
<script language = "javascript">
function javaCall(){
alert("Printer Error");
//other thing you can do
}
</script>
если у вас возникла проблема, вы можете обратиться к официальному документу.
public void loadUrl (String url)
Loads the given URL.
Also see compatibility note on evaluateJavascript(String, ValueCallback).
веб-просмотр использовать ссылку
Я попробовал, но выдает ошибку, говоря: E: FATAL EXCEPTION: Thread-22528 Процесс: com.my_web.new_project, PID: 9186 java.lang.RuntimeException: java.lang.Throwable: в потоке Thread-22528 был вызван метод WebView. Все методы WebView должны вызываться в одном потоке… и т. д. Вызвано: java.lang.Throwable: метод WebView был вызван в потоке «Thread-22528». Все методы WebView должны вызываться в одном потоке. (Ожидаемый Looper Looper (main, tid 1) {36b83ccf} вызывается по нулю, FYI main Looper - Looper (main, tid 1) {36b83ccf})
Я понял, ваш код находится в потоке, чтобы уведомить о следующем, поэтому вы можете использовать Handler для решения этой ошибки. Отредактирую ответ.
В sendMessage есть ошибка, в которой говорится, что на нестатический метод sendMessage (android.os.Message) нельзя ссылаться из статического контекста :( Я не могу найти, как это исправить
Я мог бы использовать evalJavascript (), чтобы показать окно предупреждения из Java! Можно ли отправить что-то в JS, чтобы форма не отправлялась ?? Я внес некоторые изменения в свой код.