web-dev-qa-db-ja.com

Android webviewからBluetoothサーマルプリンターに印刷をプッシュする方法は?

クラウドサーバーでOdooPOSアプリケーションを構成し、デスクトップから[領収書の印刷]をクリックすると、chromeで印刷ダイアログが自動的にポップアップし、接続されたデバイスから印刷できます!同じアプリケーションAndroid単にwebViewを入れるだけで開発されました!

Androidデバイスとペアリングされた接続されたBluetoothサーマルプリンターを使用してこれを印刷する必要があります!たくさん検索しましたが、それでも解決策が得られませんでした!リンクや提案は大いに役立ちます

16
user6761138

Webページの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に追加します。 2番目のパラメーターとして、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

9
repitch

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 を参照してください。

2
Anirban Roy

このようなサーマルプリンターは、単にESC入力(エスケープシーケンス)を期待し、HTMLマークアップまたはグラフィックスの印刷をサポートしません(ただし、それらは送信前にラスター化されています)。質問はどのプリンターを示していないため、答えるのは難しいですが、一般的には、1回はHTMLに、もう1回はESC出力にレンダリングする必要があります(一般的なサーマルプリンターも同様です- ゼブラ または エプソン )。 bluetoothserialESCを介してSPPシーケンスを送信するためにも使用できます(HTMLはうまく印刷されません)。 answer も参照してください。

0
Martin Zeitler