Как перенести печать на термопринтер bluetooth с веб-сайта Android?

Мы настроили приложение Odoo POS на облачном сервере и на рабочем столе, если щелкнуть на принт-кассе, он автоматически откроет диалог печати в хроме и может распечатать с подключенного устройства! То же самое приложение, которое мы разработали в android, просто вставив webView !

Теперь мне нужно распечатать это с помощью подключенного теплого принтера Bluetooth, подключенного к Android-устройству! Я много искал, но до сих пор не получил никакого решения! Любые ссылки или предложения будут большой помощью

Ответ 1

Если у вас есть доступ к html/js-коду вашей веб-страницы, вы можете сделать следующее:

  1. Создайте специальный класс, который будет обрабатывать 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
      }
    }
    
  2. Включить js для веб-просмотра. Затем добавьте созданный интерфейс в webView. В качестве второго параметра вам нужно указать имя, которое будет использоваться внутри js. Я назвал его "PrintInterface", как и имя класса:

    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new PrintInterface(), "PrintInterface");'
    
  3. В коде 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 не печатает хорошо). тоже смотреть ответ.