少し前に、プリンター付きの Android スマホが一部の界隈で流行りました。遅ればせながら、私も Sunmi V2 Pro をついに手に入れました。最近はオフラインの実会場で行われる勉強会やカンファレンスが少しずつですが開催されるようになったので、現場での名刺を印刷するのは楽しそう、ということで、こちらを作りました。
開発
Sunmi が SDK を配っているので、個人でも印刷可能な Android アプリを作ることができますが、私は Android アプリの開発経験が乏しいので指を咥えるだけです。しかし、React Native でも利用できるパッケージをいくつかの方が配布しているので、それを利用して、開発しました。
React Native で開発する
公開されているパッケージは多いですが、古くて動かないものや、TypeScript をサポートしてないものがあり、最適なパッケージ探しが大変です。私が調べた限りでは、こちらのパッケージが最適でした。ドキュメントが充実しており、TypeScript で型補完されるので、よく分からなくても何とかなります。
しかしながら、こちらのパッケージも、Android のリリースビルド時に失敗するという問題があったので、ひとまずパッチを作って対応しました。
@makgabri+react-native-sunmi-printer+0.1.1.patch
diff --git a/node_modules/@makgabri/react-native-sunmi-printer/android/build.gradle b/node_modules/@makgabri/react-native-sunmi-printer/android/build.gradle
index 874c6ca..88b114b 100644
--- a/node_modules/@makgabri/react-native-sunmi-printer/android/build.gradle
+++ b/node_modules/@makgabri/react-native-sunmi-printer/android/build.gradle
@@ -14,15 +14,15 @@ buildscript {
apply plugin: 'com.android.library'
-def safeExtGet(prop, fallback) {
- rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
+def getExtOrIntegerDefault(name) {
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties['SunmiPrinter_' + name]).toInteger()
}
android {
- compileSdkVersion safeExtGet('SunmiPrinter_compileSdkVersion', 29)
+ compileSdkVersion getExtOrIntegerDefault('compileSdkVersion')
defaultConfig {
- minSdkVersion safeExtGet('SunmiPrinter_minSdkVersion', 16)
- targetSdkVersion safeExtGet('SunmiPrinter_targetSdkVersion', 29)
+ minSdkVersion getExtOrIntegerDefault('minSdkVersion')
+ targetSdkVersion getExtOrIntegerDefault('targetSdkVersion')
versionCode 1
versionName "1.0"
アプリ
そんなわけで、今回作成したアプリは以下のようになります。本当は入力フォームを作ろうかと思いましたが、時間がなくハードコーディングで情報を保持されています。
(追記)その後、アプリを改修して、入力フォームを追加したので、任意のテキストおよび画像を印刷できるようにしました。
まとめ
フルリモートで地方に篭ってますが、タイミングが合えばこれを持って、勉強会などに参加しようと思います。
追記
2022年12月9日にこの内容を勉強会で発表しました。