2015-01-21 94 views
4

我正在從我的應用程序向熱敏打印機發送數據。我已經通過網絡正常工作,並且我的數據正確打印。現在有一個額外的要求,我們也必須能夠通過USB打印。通過USB從Android設備向熱敏打印機發送數據

這裏是我試過:

private UsbManager mUsbManager; 
    private UsbDevice mDevice; 
    private UsbDeviceConnection mConnection; 
    private UsbInterface mInterface; 
    private UsbEndpoint mEndPoint; 
    private PendingIntent mPermissionIntent; 
    private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; 
    private static Boolean forceCLaim = true; 

    HashMap<String, UsbDevice> mDeviceList; 
    Iterator<UsbDevice> mDeviceIterator; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 

     mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
     mDeviceList = mUsbManager.getDeviceList();  
     mDeviceIterator = mDeviceList.values().iterator(); 

     Button print = (Button)findViewById(R.id.print); 

     Toast.makeText(this, "Device List Size: " + String.valueOf(mDeviceList.size()), Toast.LENGTH_SHORT).show(); 
     TextView textView = (TextView) findViewById(R.id.usbDevice); 
     String usbDevice = ""; 
     //This is just testing what devices are connected 
     while (mDeviceIterator.hasNext()) { 
      UsbDevice usbDevice1 = mDeviceIterator.next(); 
      usbDevice += "\n" + 
        "DeviceID: " + usbDevice1.getDeviceId() + "\n" + 
        "DeviceName: " + usbDevice1.getDeviceName() + "\n" + 
        "DeviceClass: " + usbDevice1.getDeviceClass() + " - " + translateDeviceClass(usbDevice1.getDeviceClass()) + "\n" + 
        "DeviceSubClass: " + usbDevice1.getDeviceSubclass() + "\n" + 
        "VendorID: " + usbDevice1.getVendorId() + "\n" + 
        "ProductID: " + usbDevice1.getProductId() + "\n"; 

      int interfaceCount = usbDevice1.getInterfaceCount(); 
      Toast.makeText(this, "INTERFACE COUNT: " + String.valueOf(interfaceCount), Toast.LENGTH_SHORT).show(); 

      mDevice = usbDevice1; 

      if (mDevice == null) { 
       Toast.makeText(this, "mDevice is null", Toast.LENGTH_SHORT).show(); 
      }else{ 
       Toast.makeText(this, "mDevice is not null", Toast.LENGTH_SHORT).show(); 
      } 
      textView.setText(usbDevice); 
     } 

     if (mDevice == null) { 
      Toast.makeText(this, "mDevice is null", Toast.LENGTH_SHORT).show(); 
     }else{ 
      Toast.makeText(this, "mDevice is not null", Toast.LENGTH_SHORT).show(); 
     } 

     mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
     IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
     registerReceiver(mUsbReceiver, filter); 
     mUsbManager.requestPermission(mDevice, mPermissionIntent); 

    print.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //setup(); 
       print(mConnection, mInterface); 
      } 
     }); 
} 

    private String translateDeviceClass(int deviceClass){ 
     switch(deviceClass){ 
      case UsbConstants.USB_CLASS_APP_SPEC: 
       return "Application specific USB class"; 
      case UsbConstants.USB_CLASS_AUDIO: 
       return "USB class for audio devices"; 
      case UsbConstants.USB_CLASS_CDC_DATA: 
       return "USB class for CDC devices (communications device class)"; 
      case UsbConstants.USB_CLASS_COMM: 
       return "USB class for communication devices"; 
      case UsbConstants.USB_CLASS_CONTENT_SEC: 
       return "USB class for content security devices"; 
      case UsbConstants.USB_CLASS_CSCID: 
       return "USB class for content smart card devices"; 
      case UsbConstants.USB_CLASS_HID: 
       return "USB class for human interface devices (for example, mice and keyboards)"; 
      case UsbConstants.USB_CLASS_HUB: 
       return "USB class for USB hubs"; 
      case UsbConstants.USB_CLASS_MASS_STORAGE: 
       return "USB class for mass storage devices"; 
      case UsbConstants.USB_CLASS_MISC: 
       return "USB class for wireless miscellaneous devices"; 
      case UsbConstants.USB_CLASS_PER_INTERFACE: 
       return "USB class indicating that the class is determined on a per-interface basis"; 
      case UsbConstants.USB_CLASS_PHYSICA: 
       return "USB class for physical devices"; 
      case UsbConstants.USB_CLASS_PRINTER: 
       return "USB class for printers"; 
      case UsbConstants.USB_CLASS_STILL_IMAGE: 
       return "USB class for still image devices (digital cameras)"; 
      case UsbConstants.USB_CLASS_VENDOR_SPEC: 
       return "Vendor specific USB class"; 
      case UsbConstants.USB_CLASS_VIDEO: 
       return "USB class for video devices"; 
      case UsbConstants.USB_CLASS_WIRELESS_CONTROLLER: 
       return "USB class for wireless controller devices"; 
      default: return "Unknown USB class!"; 
     } 
//Broadcast receiver to obtain permission from user for connection 
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 

     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (ACTION_USB_PERMISSION.equals(action)) { 
       synchronized (this) { 
        UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 

        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
         if(device != null){ 
          //call method to set up device communication 
          mInterface = device.getInterface(0); 
          mEndPoint = mInterface.getEndpoint(0); 
          mConnection = mUsbManager.openDevice(device); 

          //setup(); 
         } 
        } 
        else { 
         //Log.d("SUB", "permission denied for device " + device); 
         Toast.makeText(context, "PERMISSION DENIED FOR THIS DEVICE", Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } 
     } 
    }; 

private void print(UsbDeviceConnection connection, UsbInterface intrface){ 

     String test = "THIS IS A PRINT TEST"; 
     byte [] testBytes = test.getBytes(); 

     if(intrface==null){ 
      Toast.makeText(this, "INTERFACE IS NULL", Toast.LENGTH_SHORT).show(); 
     } 
     if(connection==null){ 
      Toast.makeText(this, "CONNECTION IS NULL", Toast.LENGTH_SHORT).show(); 
     } 

     if(forceCLaim==null){ 
      Toast.makeText(this, "FORCE CLAIM IS NULL", Toast.LENGTH_SHORT).show(); 
     } 

     connection.claimInterface(intrface, forceCLaim); 
     connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); 

    } 

於是將設備連接到USB設備,但是當我嘗試bulktransfer什麼也沒有發生,任何人都可以揭示出這個光? USB連接對我來說是一個新的領域,所以任何提示的讚賞

編輯

因此,原來存在與終端的問題,沒有從bulktransfer回報,然而,現在這些問題都解決了,它返回批量傳輸成功,但是它仍然不打印。有沒有人有任何想法呢?

+0

問題是,你必須知道打印機的協議......只發送一個文本將不起作用...獲取打印機的文檔並找出如何打印...例如(我做了它!)你必須發送'#move 10,10; #print「這是打印測試」......也許您的打印機正在使用[ZPL](http://en.wikipedia.org/wiki/ZPL_%28programming_language%29) – Selvin 2015-01-21 12:10:42

+0

錯誤的鏈接...應該是[ZPL] ](http://en.wikipedia.org/wiki/Zebra_(programming_language)) – Selvin 2015-01-21 12:17:44

+0

@Selvin當我通過網絡打印時,我只需打開一個套接字並向下發送字節,就不需要任何附加功能它打印。有熱敏打印機命令用於居中,切割等,但沒有打印命令。這對usb會有所不同嗎? – 2015-01-21 12:24:00

回答

0

私人無效打印(UsbDeviceConnection連接的UsbInterface工程接口類){

String test = "THIS IS A PRINT TEST"; 
    byte [] testBytes = test.getBytes(); 

    if(intrface==null){ 
     Toast.makeText(this, "INTERFACE IS NULL", Toast.LENGTH_SHORT).show(); 
    } 
    if(connection==null){ 
     Toast.makeText(this, "CONNECTION IS NULL", Toast.LENGTH_SHORT).show(); 
    } 

    if(forceCLaim==null){ 
     Toast.makeText(this, "FORCE CLAIM IS NULL", Toast.LENGTH_SHORT).show(); 
    } 

    connection.claimInterface(intrface, forceCLaim); 
    connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); 
    //Just Add 
    connection.close(); 

} 
0

@ DJ鬥,我已經試過了同樣的方法,但我沒有這樣說:

,而不是String test = "THIS IS A PRINT TEST";

使用本:String test = "THIS IS A PRINT TEST\r\n";

詳細檢查:What is the difference between \r and \n?

和您的最後一行代碼「connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0);」應該在另一個線程中。

例如:

Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
    connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); 
    } 
}); 
thread.run(); //or thread.start(); -as you wish 

加成:用於切紙使用:byte[] cut_paper = {0x1D, 0x56, 0x41, 0x10}; 這個字節數組我推薦給發送一個字符串與上述前面提到\n。 它足以把與cut_paper字節數組的同一行後的第一個:

Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     connection.bulkTransfer(mEndPoint, testBytes, testBytes.length, 0); 
     connection.bulkTransfer(mEndPoint, cut_paper, cut_paper.length, 0); 
    } 
}); 
thread.run(); 

的來源還幫忙:https://developer.android.com/guide/topics/connectivity/usb/host.html

希望它能幫助:)

+0

謝謝,剪紙arry在星形打印機上爲我工作 – Herman 2016-06-16 21:53:27

相關問題