Android端末からサーマルプリンター印刷をしてみよう

本チュートリアルの内容

スマホの普及率も上がり、スマホ画面がチケット代わりになったり、決済ができるようになったりしていますが、それでも紙が必要となる場面は当面なくならないと思われます。ということで、今回は、Android端末からサーマルプリンター印刷をしてみたいと思います。

■ 事前準備

サーマルプリンターアプリのインストール

今回は、プリンターから印字をするコードを直接書かずに、シェアウェアのプリンターアプリを利用して印刷するコードを作成します。今回使用した印刷アプリは以下のアプリになります。

このアプリはIntentを利用して外部アプリから印刷をすることができます。

画像の作成

このプリンターは文字、バーコード、QRコード、画像の印字を行うことができます。今回は、キャンプ場に来たお客さんの受付予約をする際に、お客さんの携帯電話の下4桁と、使用許可を出す区画の番号を印字した紙を発行することとしますが、文字情報だけでは見栄えがしないので、画像情報も出力することとします。

プリントイメージ
図 印刷イメージ

画像はキャンプ場のロゴが書かれている部分です。

ロゴ部分
図 ロゴ部分

作成したファイルはcamp.jpgとして、Android端末のPictureフォルダーに保存しておきます。

端末のpictureフォルダ
図 Pictureフォルダーへの保存

ページの先頭へ

■ アプリの作成

プロジェクト作成

まず、Android Studioでプロジェクトを作成します。ここでは、ThermalPrinterという名前のプロジェクトを作成します。プロジェクトは「Empty Activity」を利用し、「Use legacy android.support libraries」はチェックしておきます(もちろん、チェックしなくても問題ありませんが、その場合には、Androidx対応のコードを作成してください)

プロジェクト作成
図 プロジェクト作成

レイアウト作成

まず、最初にレイアウトを作成します。画面には、TextViewを2つ、EditTextを2つ、Buttonを1つ配置します。ここでは、配置にTableLayoutを使用してみました。EditTextとButtonには、それぞれidとして、et1、et2、bt1を付与しておきます。

スクリーンレイアウト
図 スクリーンレイアウト

コード作成

コードとしては、ボタン押下時のイベント処理と、プリンターアプリに送る印字データを作成するメソッドが必要となります。ボタン押下時のイベント内に、Intentを用いたアプリ起動の処理も記載します。

// Buttonイベント
Button b = (Button)findViewById(R.id.bt1);
b.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v) {
        // Thermal printerアプリにプリントデータを送付
        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.setPackage("mate.bluetoothprint");
        sendIntent.putExtra(Intent.EXTRA_TEXT, getPrintStr());
        sendIntent.setType("text/plain");
        startActivity(sendIntent);
    }
});
        

基本的に一般的なIntentの使用方法になります。ここでは、今回使用するプリンターアプリをsetPackageで指定するのと、文字列データ作成メソッド(getPrintStr())をデータ送信の引数として用いている点です。

// printデータ作成メソッド
private String getPrintStr(){
    // EditTextデータの取得
    EditText et1 = (EditText)findViewById(R.id.et1);
    String phoneno = et1.getText().toString();
    EditText et2 = (EditText)findViewById(R.id.et2);
    String areano = et2.getText().toString();
    // 日時データ作成
    Date date = new Date(System.currentTimeMillis());
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String strdate = df.format(date);
    // 画像URL
    String imgpath= Environment.
            getExternalStoragePublicDirectory(Environment.
                    DIRECTORY_PICTURES).toString()+"/camp.jpg";
    String str="";
    str=str+"1#"+imgpath;
    str=str+"<000>\n\n  Phone number: "+phoneno;
    str=str+"<000>  Area number: "+areano+"\n";
    str=str+"<000>  Thank you for visiting!\n";
    str=str+"<020>"+strdate+"\n \n "; // シートのフィード

    return str;
}

        

今回使用するMate Technologies社のアプリを外部アプリから使用する場合の使い方は、アプリにも掲載されています。詳細はそちらを参照してもらいたいのですが、印字するためには、テキスト、画像、バーコード、QRコードのデータを文字列として表現し、そのデータをIntentのアクティビティに送る必要があります。各メディアの表現方法は要約すると以下のように表記します。

データ別 表記方法 記号の説明
テキストデータ <BAF>文字列 Bは普通(0)か太字(1)の別、Aは揃え(左(0)、中央(1)、右(2))、Fは幅と高さの改行別 "<110>This is my testing data."
画像データ <IMAGE>A#Path Aは揃え(左(0)、中央(1)、右(2))、Pathは画像データの絶対パス "<IMAGE>1#"+/画像のパス+"/test.jpg"

今回は、EditTextの文字を取得して印字しているのですが、3~7行目は文字を取得する処理です。また、印刷時間も表示するため、9~11行目で時間の文字列を作成しています。13~15行目は画像が配置されているディレクトリの文字列です。これは、Android端末のPicturesフォルダの場所を示しています。16~21行は印刷する文字列です。表で示した表記法に基づいて作成しています。

ページの先頭へ

■ 印刷テスト

では、実際に印刷をしてみます。まず、プリンターとスマホをBluetoothで接続する必要があります。接続は特別注意することはないと思います。接続されるとスクリーンショットのように表示されます。

プリンタ接続
図 プリンタ接続

アプリケーションのスクリーンショットも以下に示します。

アプリ画面
図 アプリ画面

では、実際に動かしてみましょう。プリンターが接続されていない場合、接続を促す画面が表示されますが、サーマルプリンターを選択することで印刷できると思います。

動作の模様は以下に動画を掲載しました。

バーコードは印刷することができましたが、QRコードはうまく印刷できませんでした。時間があれば、試してみたいと思います。ページの先頭へ