Android:蓝牙打印

时间:2012-03-23 11:58:52

标签: android bluetooth

我必须为Android平板电脑开发一款需要打印文件的应用程序 蓝牙打印机。通过蓝牙打印是我的应用程序最重要的功能之一。不幸的是,关于这个主题的信息并不多,所以我想征求意见。

据我所知,不可能在Android上使用蓝牙打印(使用本机通话),因为Android的BT Stack没有实现BPP(基本打印配置文件)。做了一点研究我发现了以下替代方案:

的SDK /库

  • Sybase-iAnywhere-Blue-SDK-for-Android:支持的商业SDK 很多BT档案。由一家大公司开发(很好的支持我 猜测)。我还没有找到很多关于这个的信息。是 有关于如何使用此SDK的一些文档,API或示例?是否 有谁知道如何下载演示版? (链接似乎是 我上次尝试时打破了)
  • iPrint SDK:商业SDK。他们网站上的一些例子,但没有别的。
  • Zebralink:仅适用于Zebra打印机(自然)。其他制造商也可能为他们的打印机提供API。

Google Play应用

  • PrinterShare:商业(高级密钥)
  • 蓝牙智能打印:自由轻巧。声称要打印到蓝牙打印机。

理想情况下,我不希望被绑定到特定品牌或打印机型号。现在的问题是:

  • 您认为这是最佳选择?
  • 你知道我错过的其他选择吗?
  • 我可以使用外部应用程序从我的应用程序轻松打印文件吗?
  • 我应该使用什么格式的文件才能打印出来 蓝牙? (PDF,图像等)。
  • 有关打印机制造商和型号的任何建议吗?
  • 您是否有在Android上通过蓝牙打印的真实体验?
  • 是否有任何计划在不久的将来实施蓝牙 在Android上打印?

先谢谢你的帮助;)

6 个答案:

答案 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)
        }
    }
}