当前位置: 首页 > 知识库问答 >
问题:

Android-蓝牙打印机未完成打印,但引发IOException:套接字关闭

奚晟
2023-03-14

我有一个应用程序,打印数据(文本和图像)到热敏打印机。

我的问题是,每当我打印冗长的数据时,打印输出就会被剪切,我会在打印的try-catch语句中抛出一个IOException:Socket Closed

以下是我打印数据的部分:

protected void simpleComm(Integer port){
    //InputStream tmpIn = null;
    byte[] buffer = new byte[3]; //{65,65,53,53,49,52,65,66,67,68};

    buffer[0] = (byte) 0x08;
    buffer[1] = (byte) 0x99;
    buffer[2] = (byte) 0x04;
    OutputStream tmpOut;// = null;    

    bluetoothAdapter.cancelDiscovery();

    Log.d(this.toString(), "Port = " + port);
    try {


        UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
        Method m = blueToothDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
        socket = (BluetoothSocket) m.invoke(blueToothDevice, port);

        //socket = mmDevice.createRfcommSocketToServiceRecord(uuid);

        // assert (socket != null) : "Socket is Null";
        socket.connect();

        try {
            Log.d(this.toString(),"************ CONNECTION SUCCEES! *************");
            try{
                //tmpIn=socket.getInputStream();
                tmpOut = socket.getOutputStream();

                //mmInStream = tmpIn;
                mmOutStream = tmpOut;

            }
            catch(Exception ex){
                Log.e(this.toString(), "Exception " + ex.getMessage());
            }

            //TODO print sequence starts here

            image = "logo";
            print_image(Environment.getExternalStorageDirectory().toString() + "/LOGO.png");

            byte[] arrayOfByte1 = { 27, 33, 0 };
            byte[] format = { 27, 33, 0 };

            mmOutStream.write((newline).getBytes("US-ASCII"));


            //bold
            format[2] = ((byte)(0x0 | arrayOfByte1[2]));  
            //width
            format[2] = ((byte)(0x12 | arrayOfByte1[2]));
            //height
            format[2] = ((byte)(0x8 | arrayOfByte1[2]));
            mmOutStream.write(format);


            for(int i = 0 ; i < orderListForPrinting.size(); i++ ){
                mmOutStream.write(((List.get(i)).getBytes("US-ASCII")));
            }


            //bold
            format[2] = ((byte)(0x8 | arrayOfByte1[2]));  
            //width
            format[2] = ((byte)(0x8 | arrayOfByte1[2]));
            //height
            format[2] = ((byte)(0x8 | arrayOfByte1[2]));
            mmOutStream.write(format);

            mmOutStream.write((newline).getBytes("US-ASCII"));


            printSignature();

            //bold
            format[2] = ((byte)(0x8 | arrayOfByte1[2]));  
            //width
            format[2] = ((byte)(0x8 | arrayOfByte1[2]));
            //height
            format[2] = ((byte)(0x8 | arrayOfByte1[2]));
            mmOutStream.write(format);

            mmOutStream.write(( name + "                  " + newline + newline).getBytes("US-ASCII"));                

        }
        finally{

            orderList = new ArrayList<TotalOrderClass>();
            orderListForPrinting = new ArrayList<String>();
            socket.close();
            mmOutStream.flush();
        }
    } 
    catch (IOException ex){
        Log.e(this.toString(), "IOException: " + ex.getMessage());
    } 
    catch (NoSuchMethodException ex){
        Log.e(this.toString(), "NoSuchMethodException: " + ex.getMessage());
    } 
    catch (IllegalAccessException ex){
        Log.e(this.toString(), "IllegalAccessException: " + ex.getMessage());
    } 
    catch (InvocationTargetException ex){
        Log.e(this.toString(),"InvocationTargetException: " + ex.getMessage());
    }

}

这是我的打印签名功能,它类似于我用来打印徽标的功能。

private void printSignature() {
    //TODO print signature here
    convertBitmap(signature);
    try{
        mmOutStream.write(PrinterCommands.SET_LINE_SPACING_24);

        int offset = 0;
        while (offset < signature.getHeight()) {
            mmOutStream.write(PrinterCommands.SELECT_BIT_IMAGE_MODE_SIGNATURE);
            for (int x = 0; x < signature.getWidth(); ++x) {

                for (int k = 0; k < 3; ++k) {

                    byte slice = 0;
                    for (int b = 0; b < 8; ++b) {
                        int y = (((offset / 8) + k) * 8) + b;
                        int i = (y * signature.getWidth()) + x;
                        boolean v = false;
                        if (i < dots.length()) {
                            v = dots.get(i);
                        }
                        slice |= (byte) ((v ? 1 : 0) << (7 - b));
                    }
                    mmOutStream.write(slice);
                }
            }
            offset += 24;
            mmOutStream.write(PrinterCommands.FEED_LINE);
        }

        mmOutStream.write(PrinterCommands.SET_LINE_SPACING_30);
    }
    catch (IOException e) {
        Toast.makeText(getApplicationContext(), "Catch on to print signature stuff", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }

}

ConvertBitmap函数:

public String convertBitmap(Bitmap inputBitmap) {

    int mWidth = inputBitmap.getWidth();
    int mHeight = inputBitmap.getHeight();

    convertArgbToGrayscale(inputBitmap, mWidth, mHeight);
    String mStatus = "ok";
    return mStatus;

}

convertArgbToGrayScale函数:

private void convertArgbToGrayscale(Bitmap bmpOriginal, int width,
        int height) {
    int pixel;
    int k = 0;
    int B = 0, G = 0, R = 0;
    dots = new BitSet();
    try {

        for (int x = 0; x < height; x++) {
            for (int y = 0; y < width; y++) {
                // get one pixel color
                pixel = bmpOriginal.getPixel(y, x);

                // retrieve color of all channels
                R = Color.red(pixel);
                G = Color.green(pixel);
                B = Color.blue(pixel);
                // take conversion up to one single value by calculating
                // pixel intensity.
                R = G = B = (int) (0.299 * R + 0.587 * G + 0.114 * B);
                // set bit into bitset, by calculating the pixel's luma
                if (R < 55) {                       
                    dots.set(k);//this is the bitset that i'm printing
                }
                k++;

            }


        }


    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), "Catch on to Grayscale stuff", Toast.LENGTH_LONG).show();
    }
}

我现在的问题是,在调用printSignature()函数后,打印机停止打印,套接字关闭,这就是为什么我得到IOException:socket closed error。

我已经运行了很多次这个函数,我不知道为什么套接字会关闭,因为我只在try-catch的finally子句中关闭套接字。

有什么想法吗?

共有2个答案

段干宏硕
2023-03-14

我要做的是,我放一个线程。睡眠(x),每次之后。Write(),其中x是我的输出字符串中的字符数,在代码中可能有所不同,但程序在关闭前必须等待的时间与打印字符(或行)的数量成正比。

史意致
2023-03-14

如果你把一个Thread.sleep(2000)放在socket.close()前面会发生什么?

我在蓝牙SPP上工作,我也遇到了同样的问题(数据传输结束前插座关闭)。我认为,socket的广播。close()比数据传输更快,那么当发送关闭请求时,BT打印机不会分析所有数据

 类似资料:
  • 我必须为Android平板电脑开发一个应用程序,要求将文件打印到蓝牙打印机上。 通过蓝牙打印是我应用程序最重要的功能之一。 我尝试了这个项目和这个项目。 它不工作,也不报告任何错误-不要打印。 蓝牙打印机有什么建议吗?

  • 大多数相关的答案和谷歌都包含了关于这个话题的相当古老的贡献。因此,我正在寻找一种方法,使我的Android应用程序打印收据(58毫米宽)通过蓝牙热收据打印机。是否有必要使用带有第三方API的打印机?我想买一台普通的蓝牙打印机,它可以连接到我的设备上,并使用默认的Android打印管理器为收据进行布局。有可能吗?有样本、文档或教程吗?会很感激的。提前致谢

  • 我正在尝试通过蓝牙打印到热敏打印机。 我以前能够在Nexus 7设备(第一代和第二代)上成功打印。然而,当我将完全相同的代码复制粘贴到不同的应用程序上,并将其部署到华硕平板电脑上时,我突然得到一个,告诉我我的套接字可能已关闭。 这是我的代码: 这里是来自try-cat块的错误: 现在我很困惑,为什么当我所做的只是将代码部署到不同的设备上时会突然出现错误。 我该如何进行?

  • 我已经开发了一个android应用程序来从蓝牙打印机打印账单,我的代码抛出的异常是“java.lang.NullPointerException:试图在空对象引用上调用虚拟方法'void java.io.OutputStream.write(byte[])”。 连接蓝牙打印机并发送数据进行打印的代码如下: //这将找到一个蓝牙打印机设备 //打印数据的代码

  • 我正在开发通过蓝牙与打印机连接并打印一些文本的应用程序。我可以通过蓝牙连接打印机,然后从BluetoothSocket获取输出流并写一些文本。但它不会用打印机打印任何东西...我仔细检查过,没有例外。请帮帮我我在代码中做错了什么???我使用佳能MX430打印机进行测试...这是我的代码

  • 问题内容: 我必须在热蓝牙打印机上打印一些数据,我正在这样做: 它适用于文本,但不适用于图像。我想我需要获取byte[]图像数据。我尝试通过这种方式获取图像数据: 不幸的是,打印机打印了许多奇怪的字符(大约50厘米的纸张)。我不知道如何打印图像。 我想尝试获取位图的像素,然后将其转换为a byte[]并发送,但是我不知道该怎么做。 谢谢 更新: 经过这么长时间,我正在执行此操作:我有一个名为pri