我必须为Android平板电脑开发一款需要打印文件的应用程序 蓝牙打印机。通过蓝牙打印是我的应用程序最重要的功能之一。不幸的是,关于这个主题的信息并不多,所以我想征求意见。
据我所知,不可能在Android上使用蓝牙打印(使用本机通话),因为Android的BT Stack没有实现BPP(基本打印配置文件)。做了一点研究我发现了以下替代方案:
的SDK /库
Google Play应用
理想情况下,我不希望被绑定到特定品牌或打印机型号。现在的问题是:
先谢谢你的帮助;)
答案 0 :(得分:12)
Star Micronics有一个通过蓝牙(以及以太网和USB)进行Android打印的SDK。您可以在此处下载:http://www.starmicronics.com/support/SDKDocumentation.aspx。
正如您所提到的,您现在无法在本地打印,因此您找到的替代解决方案是您今天的选择。
根据我的经验,最好使用API而不是外部应用程序。最大的原因是您可以完全控制打印机行为。如果API是智能构建的,那也很容易。使用外部应用程序是有限制的,因为您无法按照自己的方式自定义打印输出。
我链接到你的Star SDK有一个非常好的示例应用程序,可让您测试和自定义许多打印机功能,以便查看它们的运行情况。每个函数都记录在源代码中。这些命令及其参数也可以在应用程序本身中作为快速屏幕参考使用,这很方便。最重要的是,它有很好的记录。
Star是一家伟大的合作公司,因为您可以获得自己选择的免费演示打印机,用于您的开发。
如果选择这种方式,您可以将纯文本连同命令一起发送到打印机。 API处理将数据转换为打印机可以理解的内容。
答案 1 :(得分:1)
打印到BlueTooth打印机的可能性很大程度上取决于您尝试使用的打印机型号。
例如,我使用 CITIZEN CMP-10BT 打印机,可以通过发送特定的字节序列来控制,这可以通过Android API轻松完成。我甚至在此基础上构建了一个框架。
问题在于,您无法确定哪些打印机型号将被最终用户使用,因此一些终极SDK肯定非常需要。
答案 2 :(得分:1)
您可以下载此组件: https://components.xamarin.com/view/ocpp-thermal-printer-usb它在大多数USB和蓝牙通用打印机中都很有魅力。我用一个类来发送最常用的esc命令。用法:outerInstance.mService.Write(modes.pordefecto());
public class modes
{
public static byte[] condensado()
{
byte[] cmd = new byte[3];
cmd[0] = 0x1b;
cmd[1] = 0x21;
cmd[2] |= 0x01;
return cmd;
}
public static byte[] pordefecto()
{
byte[] cmd = new byte[3];
cmd[0] = 0x1b;
cmd[1] = 0x21;
cmd[2] |= 0x00;
return cmd;
}
public static byte[] negrita()
{
byte[] cmd = new byte[3];
cmd[0] = 0x1b;
cmd[1] = 0x21;
cmd[2] |= 0x08;
return cmd;
}
public static byte[] lineamenor()
{
byte[] cmd = new byte[3];
cmd[0] = 0x1b;
cmd[1] = 0x33;
cmd[2] |= 0x14;
return cmd;
}
public static byte[] cancelalinea()
{
byte[] cmd = new byte[2];
cmd[0] = 0x1b;
cmd[1] = 0x32;
return cmd;
}
public static byte[] centra()
{
byte[] cmd = new byte[3];
cmd[0] = 0x1b;
cmd[1] = 0x61;
cmd[2] |= 0x01;
return cmd;
}
public static byte[] quitacentro()
{
byte[] cmd = new byte[3];
cmd[0] = 0x1b;
cmd[1] = 0x61;
cmd[2] |= 0x00;
return cmd;
}
public static byte[] codepage()
{
byte[] cmd = new byte[5];
cmd[0] = 0x1f;
cmd[1] = 0x1b;
cmd[2] = 0x1f;
cmd[3] |= 0xfe;
cmd[4] |= 0x01;
return cmd;
}
public static byte[] latino()
{
byte[] cmd = new byte[5];
cmd[0] = 0x1f;
cmd[1] = 0x1b;
cmd[2] = 0x1f;
cmd[3] |= 0xff;
cmd[4] |= 0x12;
return cmd;
}
public static byte[] logo()
{
byte[] cmd = new byte[4];
cmd[0] = 0x1c;
cmd[1] = 0x70;
cmd[2] = 0x01;
cmd[3] |= 0x00;
return cmd;
}
}
答案 3 :(得分:0)
将Printooth库用于任何类型的打印机,配置零,使用简单,文档完善
https://github.com/mazenrashed/Printooth
下面是示例代码,用于打印简单的行:
var printables = ArrayList<Printable>()
var printable = Printable.PrintableBuilder()
.setImage(image)
.setNewLinesAfter(1) // To provide n lines after sentence
.build()
printables.add(printable)
BluetoothPrinter.printer().print(printables)
您可以在这里继续阅读: https://github.com/mazenrashed/Printooth/blob/master/README.md
答案 4 :(得分:0)
任何使用ZPL的打印机都可以简单地通过通过蓝牙接口将指令写入打印机的方式进行打印(经过测试并可以工作)
我的问题是我不确定如何检测BT设备是否是打印机
write(zplString, btSocket)
fun write(bytes: String, socket: BluetoothSocket) {
val mmOutStream = socket.outputStream
/* Send data to BT device */
try {
mmOutStream?.write(bytes.toByteArray(Charset.forName("UTF-8")))
} catch (e : Exception){
Log.v("BT", "Unable to send message")
if (socket.isConnected){
socket.close()
}
attemptConnection()
try {
for (mSocket in sockets) {
val fbOutStream = mSocket.outputStream
fbOutStream?.write(bytes.toByteArray(Charset.forName("UTF-8")))
}
} catch (e : Exception){
/* Fallback write failed */
Log.v("BT", "Unable to send message second attempt")
}
}
}
private fun attemptConnection(){
for (socket in sockets){
try{
if (socket.isConnected){
socket.close()
}
} catch (e: Exception){
/* Do nothing, we just want to try to close it */
}
}
sockets.clear()
for (device in btConnectList) {
var tempSocket: BluetoothSocket? = null
try {
tempSocket = device.createInsecureRfcommSocketToServiceRecord(myUUID)
} catch (e: Exception) {
Log.v("BT", "Could not connect to socket")
}
if (tempSocket != null) {
try {
tempSocket.connect()
} catch (e: IOException) {
Log.v("BT", "Connection falied attempting fallback")
try {
val clazz = tempSocket.remoteDevice.javaClass
val paramTypes = arrayOf<Class<*>>(Int::class.java)
val m = clazz.getMethod("createRfcommSocket", *paramTypes)
val fallbackSocket =
m.invoke(tempSocket.remoteDevice, 2) as BluetoothSocket
fallbackSocket.connect()
} catch (e: Exception) {
Log.v("BT", "Fallback failed")
}
}
sockets.add(tempSocket)
} else {
/* Try fallback */
try {
tempSocket = device.bluetoothClass.javaClass.getMethod(
"createRfcommSocket", Int::class.java
).invoke(device, 1) as BluetoothSocket
tempSocket.connect()
sockets.add(tempSocket)
} catch (e: Exception) {
Log.v("BT", "Fallback failed")
}
}
}
}
答案 5 :(得分:0)
从android 4.4开始,您可以使用如下所述的Android框架库进行打印: https://developer.android.com/training/printing
例如,要打印图像,您可以执行以下操作:
private fun doPhotoPrint() {
activity?.also { context ->
PrintHelper(context).apply {
scaleMode = PrintHelper.SCALE_MODE_FIT
}.also { printHelper ->
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.droids)
printHelper.printBitmap("droids.jpg - test print", bitmap)
}
}
}