16

我们在云服务器和桌面配置了 Odoo POS 应用程序,如果我们点击打印收据,它会自动在 chrome 中弹出打印对话框,并且可以从连接的设备打印!我们在android中开发的相同应用程序只需放入webView

现在我需要使用与 Android 设备配对的已连接蓝牙热敏打印机来打印它!我搜索了很多,但仍然没有得到任何解决方案!任何链接或建议都会有很大帮助

4

3 回答 3

10

如果您可以访问网页的 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. 为 webview 启用 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

于 2018-09-24T12:14:46.103 回答
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);
        }

    }
}

然后从 WebView 中的 HTML 调用

<input type="button" onClick="doWebViewPrint()" />

<script type="text/javascript">
    function doWebViewPrint() {
        Android.doPrint();
    }
</script>

有关更多信息,请参阅https://developer.android.com/training/printing/html-docs

于 2018-09-24T18:56:49.683 回答
0

这种热敏打印机ESC需要输入(转义序列)并且不支持打印HTML标记或图形(除非它们在发送之前已经被光栅化)。很难回答,因为这个问题并没有指明是哪台打印机——但一般来说,一个打印机必须渲染一次HTML——一次ESC输出(假设常见的热敏打印机,比如ZebraEpson)。bluetoothserial也可用于通过(不能很好地打印)发送ESC序列。另见答案SPPHTML

于 2018-09-28T19:39:46.440 回答