Как перенести печать на термопринтер bluetooth с веб-сайта Android?
Мы настроили приложение Odoo POS на облачном сервере и на рабочем столе, если щелкнуть на принт-кассе, он автоматически откроет диалог печати в хроме и может распечатать с подключенного устройства! То же самое приложение, которое мы разработали в android, просто вставив webView
!
Теперь мне нужно распечатать это с помощью подключенного теплого принтера Bluetooth, подключенного к Android-устройству! Я много искал, но до сих пор не получил никакого решения! Любые ссылки или предложения будут большой помощью
Ответы
Ответ 1
Если у вас есть доступ к html/js-коду вашей веб-страницы, вы можете сделать следующее:
-
Создайте специальный класс, который будет обрабатывать js-обратные вызовы:
private class PrintInterface {
@JavascriptInterface // required annotation!
public void printSome(String arg) { // here you can pass some args from js code
// do some printing here from Java code
}
}
-
Включить js для веб-просмотра. Затем добавьте созданный интерфейс в webView. В качестве второго параметра вам нужно указать имя, которое будет использоваться внутри js. Я назвал его "PrintInterface", как и имя класса:
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new PrintInterface(), "PrintInterface");'
-
В коде js вызовите соответствующий метод из PrintInterface. Обратите внимание, что каждый метод должен быть аннотирован с помощью @JavascriptInterface
(смотрите 1.):
$("#someHtmlButton").on("click", function() {
PrintInterface.printSome("some argument");
}
Итак, наконец, внутри вашего метода PrintInterface # printSome вы можете делать все, что хотите, прямо из кода Java.
Некоторые документы о печати html: https://developer.android.com/training/printing/html-docs
Ответ 2
Android 4.4 теперь WebView теперь имеет возможность печатать HTML-документы. Пожалуйста, следуйте этому:
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webView = new WebView(this);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavascriptInterface(this, webView), "Android");
webView.loadUrl("Odoo receipt url");
setContentView(webView);
// Keep a reference to WebView object until you pass the PrintDocumentAdapter
// to the PrintManager
mWebView = webView;
}
public class MyJavascriptInterface {
Context context;
WebView view;
public MyJavascriptInterface(Context context, WebView view) {
this.context = context;
this.view = view;
}
@android.webkit.JavascriptInterface
public void doPrint() {
createWebPrintJob(view);
}
private void createWebPrintJob(WebView webView) {
// Get a PrintManager instance
PrintManager printManager = (PrintManager) getActivity()
.getSystemService(Context.PRINT_SERVICE);
String jobName = getString(R.string.app_name) + " Document";
// Get a print adapter instance
PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter(jobName);
// Create a print job with name and adapter instance
PrintJob printJob = printManager.print(jobName, printAdapter,
new PrintAttributes.Builder().build());
// Save the job object for later status checking
mPrintJobs.add(printJob);
}
}
}
а затем вызывать из HTML внутри WebView как
<input type="button" onClick="doWebViewPrint()" />
<script type="text/javascript">
function doWebViewPrint() {
Android.doPrint();
}
</script>
Для получения дополнительной информации см. Https://developer.android.com/training/printing/html-docs
Ответ 3
такие термопринтеры просто ожидают ввода ESC
(escape-последовательности) и не поддерживают печать разметки или графики HTML
(если только они не были растрированы перед их отправкой). это сложно ответить, потому что вопрос не указывает, какой принтер, но в общем случае нужно один раз отобразить HTML
и один раз на выход ESC
(при условии использования общих термопринтеров, таких как Zebra или Epson). bluetoothserial также может использоваться для отправки ESC
последовательностей через SPP
(HTML
не печатает хорошо). тоже смотреть ответ.