精华内容
下载资源
问答
  • 对于智能POS、收银机以及其他打印设备,如果厂商不提供打印相关sdk,那么打印功能怎么实现呢?其实我们可以基于USB通信机制,自己去实现打印驱动。整个实现流程如下 初始化打印机:首先要获取USB管理器;其次要注册...

    Android下的设备调试,如果设备提供了驱动,按照厂家的驱动调试即可;设备未提供驱动,只能按照通用的方法进行调试。

    对于智能POS、收银机以及其他打印设备,如果厂商不提供打印相关sdk,那么打印功能怎么实现呢?其实我们可以基于USB通信机制,自己去实现打印驱动。

    整个实现流程如下

    1. 初始化打印机:首先要获取USB管理器;其次要注册监听USB设备插拔变化和请求权限的广播;最后列出所有的USB设备,并且都请求获取USB权限;

    2. 实现这个广播接收器:当接收到请求权限的广播时,获取USB设备的引用,android系统会询问你是否允许设备访问,默认为false;当允许了访问之后,会判断USB的引用是否为null, 如果不为空,说明该设备可以连接,否则提示设备拒绝访问;如果接收到已连接的打印设备移除的广播,则要关闭本次连接。

    3. 对于获得权限可使用的USB,我们将获取设备的功能集(UsbInterface)和通信通道(UsbEndpoint),然后创建host与device的连接用来传输数据。

    4. 最后,我们在需要打印的地方调用上面封装好的打印方法,就可以发送指令来控制已经建立连接的打印机了。

    USB打印机实现

    /**
     * USB打印机
     * Created by john on 17-5-10.
     */
    
    public class USBPrinter {
    
        private static final String ACTION_USB_PERMISSION = "com.usb.printer.USB_PERMISSION";
    
        private static USBPrinter mInstance;
    
        private Context mContext;
        private UsbDevice mUsbDevice;
        private PendingIntent mPermissionIntent;
        private UsbManager mUsbManager;
        private UsbDeviceConnection mUsbDeviceConnection;
    
        private final BroadcastReceiver mUsbDeviceReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (ACTION_USB_PERMISSION.equals(action)) {
                    synchronized (this) {
                        UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                            mUsbDevice = usbDevice;
                        } else {
                            Toast.makeText(context, "Permission denied for device " + usbDevice, Toast.LENGTH_SHORT).show();
                        }
                    }
                } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                    if (mUsbDevice != null) {
                        Toast.makeText(context, "Device closed", Toast.LENGTH_SHORT).show();
                        if (mUsbDeviceConnection != null) {
                            mUsbDeviceConnection.close();
                        }
                    }
                }
            }
        };
    
        private USBPrinter() {
    
        }
    
        public static USBPrinter getInstance() {
            if (mInstance == null) {
                mInstance = new USBPrinter();
            }
            return mInstance;
        }
    
        /**
         * 初始化打印机,需要与destroy对应
         *
         * @param context 上下文
         */
        public static void initPrinter(Context context) {
            getInstance().init(context);
        }
    
        /**
         * 销毁打印机持有的对象
         */
        public static void destroyPrinter() {
            getInstance().destroy();
        }
    
        private void init(Context context) {
            mContext = context;
            mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
            mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
            IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
            filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
            mContext.registerReceiver(mUsbDeviceReceiver, filter);
    
            // 列出所有的USB设备,并且都请求获取USB权限
            HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
    
            for (UsbDevice device : deviceList.values()) {
                mUsbManager.requestPermission(device, mPermissionIntent);
            }
        }
    
        private void destroy() {
            mContext.unregisterReceiver(mUsbDeviceReceiver);
    
            if (mUsbDeviceConnection != null) {
                mUsbDeviceConnection.close();
                mUsbDeviceConnection = null;
            }
    
            mContext = null;
            mUsbManager = null;
        }
    
        /**
         * 打印方法
         * @param msg
         */
        public void print(String msg) {
            final String printData = msg;
            if (mUsbDevice != null) {
                UsbInterface usbInterface = mUsbDevice.getInterface(0);
                for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
                    final UsbEndpoint ep = usbInterface.getEndpoint(i);
                    if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                        if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
                            mUsbDeviceConnection = mUsbManager.openDevice(mUsbDevice);
                            if (mUsbDeviceConnection != null) {
                                Toast.makeText(mContext, "Device connected", Toast.LENGTH_SHORT).show();
                                mUsbDeviceConnection.claimInterface(usbInterface, true);
                                new Thread(new Runnable() {
                                    @Override
                                    public void run() {
                                        byte[] bytes = printData.getBytes();
                                        int b = mUsbDeviceConnection.bulkTransfer(ep, bytes, bytes.length, 100000);
                                        Log.i("Return Status", "b-->" + b);
                                    }
                                }).start();
    
                                mUsbDeviceConnection.releaseInterface(usbInterface);
                                break;
                            }
                        }
                    }
                }
            } else {
                Toast.makeText(mContext, "No available USB print device", Toast.LENGTH_SHORT).show();
            }
        }
    }
    
    
    展开全文
  • 最近帮一个客户在调试打印机打印,纸张是19CM*9CM,可是无论怎么设置都出来不来,奶奶的,把9CM改成10CM就可以了。 真是搞不懂为什么Epson LQ-300K+打印机不能自定义打印宽度和高度都小于10CM纸张   最后只好...

    最近帮一个客户在调试打印机的打印,纸张是19CM*9CM,可是无论怎么设置都出来不来,奶奶的,把9CM改成10CM就可以了。

    真是搞不懂为什么Epson LQ-300K+打印机不能自定义打印宽度和高度都小于10CM纸张

     

    最后只好打到EPSON公司了,客服人员就说高度和宽度都不支持小于10CM以下的纸张,并说,使用LQ-1600K的打印机驱动,客服人员说,这个驱动是和LQ-300K+是通用的。

     

    不过,更换了打印机驱动,确实可以。

     

    希望有用这个打印机的朋友要留意一下这个了。

    展开全文
  • Android下的设备调试,如果设备提供了驱动,按照厂家的驱动调试...对于智能POS、收银机以及其他打印设备,如果厂商不提供打印相关sdk,那么打印功能怎么实现呢?其实我们可以基于USB通信机制,自己去实现打印驱动。...

    原文:http://blog.csdn.net/johnwcheung/article/details/71576833

    Android下的设备调试,如果设备提供了驱动,按照厂家的驱动调试即可;设备未提供驱动,只能按照通用的方法进行调试。

    对于智能POS、收银机以及其他打印设备,如果厂商不提供打印相关sdk,那么打印功能怎么实现呢?其实我们可以基于USB通信机制,自己去实现打印驱动。

    整个实现流程如下

    1. 初始化打印机:首先要获取USB管理器;其次要注册监听USB设备插拔变化和请求权限的广播;最后列出所有的USB设备,并且都请求获取USB权限;

    2. 实现这个广播接收器:当接收到请求权限的广播时,获取USB设备的引用,android系统会询问你是否允许设备访问,默认为false;当允许了访问之后,会判断USB的引用是否为null, 如果不为空,说明该设备可以连接,否则提示设备拒绝访问;如果接收到已连接的打印设备移除的广播,则要关闭本次连接。

    3. 对于获得权限可使用的USB,我们将获取设备的功能集(UsbInterface)和通信通道(UsbEndpoint),然后创建host与device的连接用来传输数据。

    4. 最后,我们在需要打印的地方调用上面封装好的打印方法,就可以发送指令来控制已经建立连接的打印机了。

    USB打印机实现

    /**
     * USB打印机
     * Created by john on 17-5-10.
     */
    
    public class USBPrinter {
    
        private static final String ACTION_USB_PERMISSION = "com.usb.printer.USB_PERMISSION";
    
        private static USBPrinter mInstance;
    
        private Context mContext;
        private UsbDevice mUsbDevice;
        private PendingIntent mPermissionIntent;
        private UsbManager mUsbManager;
        private UsbDeviceConnection mUsbDeviceConnection;
    
        private final BroadcastReceiver mUsbDeviceReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (ACTION_USB_PERMISSION.equals(action)) {
                    synchronized (this) {
                        UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                            mUsbDevice = usbDevice;
                        } else {
                            Toast.makeText(context, "Permission denied for device " + usbDevice, Toast.LENGTH_SHORT).show();
                        }
                    }
                } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                    if (mUsbDevice != null) {
                        Toast.makeText(context, "Device closed", Toast.LENGTH_SHORT).show();
                        if (mUsbDeviceConnection != null) {
                            mUsbDeviceConnection.close();
                        }
                    }
                }
            }
        };
    
        private USBPrinter() {
    
        }
    
        public static USBPrinter getInstance() {
            if (mInstance == null) {
                mInstance = new USBPrinter();
            }
            return mInstance;
        }
    
        /**
         * 初始化打印机,需要与destroy对应
         *
         * @param context 上下文
         */
        public static void initPrinter(Context context) {
            getInstance().init(context);
        }
    
        /**
         * 销毁打印机持有的对象
         */
        public static void destroyPrinter() {
            getInstance().destroy();
        }
    
        private void init(Context context) {
            mContext = context;
            mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
            mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
            IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
            filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
            mContext.registerReceiver(mUsbDeviceReceiver, filter);
    
            // 列出所有的USB设备,并且都请求获取USB权限
            HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
    
            for (UsbDevice device : deviceList.values()) {
                mUsbManager.requestPermission(device, mPermissionIntent);
            }
        }
    
        private void destroy() {
            mContext.unregisterReceiver(mUsbDeviceReceiver);
    
            if (mUsbDeviceConnection != null) {
                mUsbDeviceConnection.close();
                mUsbDeviceConnection = null;
            }
    
            mContext = null;
            mUsbManager = null;
        }
    
        /**
         * 打印方法
         * @param msg
         */
        public void print(String msg) {
            final String printData = msg;
            if (mUsbDevice != null) {
                UsbInterface usbInterface = mUsbDevice.getInterface(0);
                for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
                    final UsbEndpoint ep = usbInterface.getEndpoint(i);
                    if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                        if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
                            mUsbDeviceConnection = mUsbManager.openDevice(mUsbDevice);
                            if (mUsbDeviceConnection != null) {
                                Toast.makeText(mContext, "Device connected", Toast.LENGTH_SHORT).show();
                                mUsbDeviceConnection.claimInterface(usbInterface, true);
                                new Thread(new Runnable() {
                                    @Override
                                    public void run() {
                                        byte[] bytes = printData.getBytes();
                                        int b = mUsbDeviceConnection.bulkTransfer(ep, bytes, bytes.length, 100000);
                                        Log.i("Return Status", "b-->" + b);
                                    }
                                }).start();
    
                                mUsbDeviceConnection.releaseInterface(usbInterface);
                                break;
                            }
                        }
                    }
                }
            } else {
                Toast.makeText(mContext, "No available USB print device", Toast.LENGTH_SHORT).show();
            }
        }
    }

    转载于:https://www.cnblogs.com/tc310/p/8510657.html

    展开全文
  • 打印的这一块存在问题,我在xamarin和vs里面进行运行或调试的时候打印功能一切正常,但是使用nssm装成windows服务以后就开始报异常,异常的详细信息如下:System.Drawing.Printing.InvalidPrinterException: No ...
  • 19.11.15日报

    2019-11-17 18:55:08
    在某些打印机上总是没居中,苦于我没那个打印机调试进度比较慢。 2,修复https://mj19916992-4.icoc.vc/显示有乱码的问题。原因是gzip解压出来,最后剩下一个字节,然后curl认为解压失败了。但我更新到新版本curl...

    1,这一周都在撸打印相关功能。在某些打印机上总是没居中,苦于我没那个打印机,调试进度比较慢。

    2,修复https://mj19916992-4.icoc.vc/显示有乱码的问题。原因是gzip解压出来,最后剩下一个字节,然后curl认为解压失败了。但我更新到新版本curl和zip还是没用。神奇的是ewe居然可以。暂时不清楚具体他是怎么解决的,不过我稍微规避下就行了。

    展开全文
  • AI如何与数衍结合 如何全面进入桥接AI时代,我们分解我们的工作,每个工作环节哪里出问题,哪里...是否影响打印机工作,是否影响打印效果。投诉最多的是现场工作一小时,每调整一个参数打印测试一次,打印了半卷纸。...
  • 上述的功能,只是做出来通用对话框,本人没有打印机,所以不能调试 打印和页面设置功能。查找和替换功能还没想到怎么做。所以…… 本程序新加了一个功能就是 颜色设置,这是windows记事本中没有的。 最后。希望对...
  • 1.1.2 Linux 该怎么念? 1.1.3 Linux 的历史 1.1.4 Linux的优点 1.2 Linux与开源软件 1.3 Linux 与 Windows 的比较 1.3.1 开发模式和系统架构的区别 1.3.2 局部的区别 1.4 Linux 与 Unix的比较 1.5 Linux 的发行版本...
  • C.11.4 打印 C.11.5 系统 C.11.6 终端 C.11.7 文本 C.12 X11 C.12.1 娱乐 C.12.2 应用 C.12.3 游戏 C.12.4 库 C.12.5 外壳 C.12.6 工具 C.12.7 窗口管理 C.12.8 XFree86 C.12.9 gnome D 通用参数 D.1...
  • Linux从入门到精通

    2010-04-25 19:58:09
    C.11.4 打印 C.11.5 系统 C.11.6 终端 C.11.7 文本 C.12 X11 C.12.1 娱乐 C.12.2 应用 C.12.3 游戏 C.12.4 库 C.12.5 外壳 C.12.6 工具 C.12.7 窗口管理 C.12.8 XFree86 C.12.9 gnome D 通用参数 D.1...
  • linux从入门到精通.chm

    2010-05-17 09:11:20
    C.11.4 打印 C.11.5 系统 C.11.6 终端 C.11.7 文本 C.12 X11 C.12.1 娱乐 C.12.2 应用 C.12.3 游戏 C.12.4 库 C.12.5 外壳 C.12.6 工具 C.12.7 窗口管理 C.12.8 XFree86 C.12.9 gnome D 通用参数 D.1...
  • 《Linux从入门到精通》

    热门讨论 2008-09-04 17:05:49
    C.11.4 打印 C.11.5 系统 C.11.6 终端 C.11.7 文本 C.12 X11 C.12.1 娱乐 C.12.2 应用 C.12.3 游戏 C.12.4 库 C.12.5 外壳 C.12.6 工具 C.12.7 窗口管理 C.12.8 XFree86 C.12.9 gnome D 通用参数 D.1...
  • 深入浅出MFC【侯捷】

    2015-06-10 09:07:42
    CScrollView 大窗口中的小窗口:Splitter 切分窗口的功能 切分窗口的程序概念 切分窗口的实现 本章回顾 第12章 打印与预览 概述 打印操作的后台原理 MFC默认的打印机制 Scribble打印机制的增强 打印机的页和文件的页...
  • 侯捷- -深入浅出MFC

    2010-07-28 16:55:58
    打印机的页和文件的页 配置GDI绘图工具 尺寸与方向:关于映射方式(坐标系统) 分页 页眉与页脚 动态计算页码 打印预览(Print Preview) 本章回顾 第13章 多重文件与多重显示 MDI和SDI 多重显示(Multiple Views) ...
  • 深入浅出MFC 2e

    2010-05-25 22:43:24
    打印机的页和文件的页 配置GDI绘图工具 尺寸与方向:关于映射方式(坐标系统) 分页 页眉与页脚 动态计算页码 打印预览(Print Preview) 本章回顾 第13章 多重文件与多重显示 MDI和SDI 多重显示(Multiple Views) ...
  • 深入浅出MFC 简体中文

    2009-08-18 10:52:54
    打印机的页和文件的页 配置GDI绘图工具 尺寸与方向:关于映射方式(坐标系统) 分页 页眉与页脚 动态计算页码 打印预览(Print Preview) 本章回顾 第13章 多重文件与多重显示 MDI和SDI 多重显示(Multiple Views) ...
  • 1 理解计算机是怎么运行程序的 2 运行一个已解释的程序 3 运行一个已编译的程序 4 C++在哪里 5 理解Visual c++中的程序文件 6 创建源代码文件 7 理解并创建头文件 第二章 结构和语法 8 理解计算机语言 9 理解计算机...
  • 1 理解计算机是怎么运行程序的 2 运行一个已解释的程序 3 运行一个已编译的程序 4 C++在哪里 5 理解Visual c++中的程序文件 6 创建源代码文件 7 理解并创建头文件 第二章 结构和语法 8 理解计算机语言 9 理解计算机...
  • 1 理解计算机是怎么运行程序的 2 运行一个已解释的程序 3 运行一个已编译的程序 4 C++在哪里 5 理解Visual c++中的程序文件 6 创建源代码文件 7 理解并创建头文件 第二章 结构和语法 8 理解计算机语言 9 理解计算机...
  • 1 理解计算机是怎么运行程序的 2 运行一个已解释的程序 3 运行一个已编译的程序 4 C++在哪里 5 理解Visual c++中的程序文件 6 创建源代码文件 7 理解并创建头文件 第二章 结构和语法 8 理解计算机语言 9 理解计算机...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    打印出49。不管按什么顺序计算,难道不该是56吗? 3.3 对于代码inti=3;i=i++;不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? *3.4 有这样一个巧妙的表达式:a^=b^=a^=b;它不需要临时变量就可以交换...
  • 不管按什么顺序计算, 难道不该打印出56吗? o 4.3 对于代码 int i = 3; i = i++; 不同编译器给出不同的结果, 有的为 3, 有的为 4, 哪个是正确的? o 4.4 这是个巧妙的表达式: a ^= b ^= a ^= b 它不需要临时变量就...

空空如也

空空如也

1 2
收藏数 36
精华内容 14
关键字:

打印机怎么调试打印