2015-05-28 9 views
5

Sto usando il seguente codice per stampare tramite dispositivo Android con cavo USB collegato alla mia stampante Samsung.Stampa Uso del cavo USB Problema

Quando utilizzare il metodo che darmi a seguito della verifica nel registro di debug:

  1. Comando per stampante inviata con successo
  2. permesso dalla stampante scontato.

e la stampante inizia a emettere un segnale acustico, ma i dati forniti non vengono stampati. Sono bloccato in questa fase e non ho trovato alcun aiuto da google o su stackoverflow.

Nota: Non v'è alcun incidente nessun errore né

sto testando questo codice su gelatina di fagioli Android 4.3 OS

Qualsiasi aiuto sarebbe apprezzato.

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; 

int protocol; 

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

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

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

     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"; 

       protocol = usbDevice1.getDeviceProtocol(); 

       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(); 
      } 

     print.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View view) 
        { 
         mPermissionIntent = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
         IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
         registerReceiver(mUsbReceiver, filter); 
         if (mDevice != null) 
          mUsbManager.requestPermission(mDevice, mPermissionIntent); 
         // else 
         // Toast.makeText(this, "USB ", Toast.LENGTH_SHORT).show(); 

         // 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); 

               Log.i("Info", "Device permission granted"); 
               startPrinting(device); 

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

public void startPrinting(final UsbDevice printerDevice) 
    { 
     Handler handler = new Handler(); 
     handler.post(new Runnable() 
      { 
       UsbDeviceConnection conn; 
       UsbInterface usbInterface; 

       @Override 
       public void run() 
        { 
         try 
          { 
           Log.i("Info", "Bulk transfer started"); 
           // usbInterface = printerDevice.getInterface(0); 

           for (int i = 0; i < printerDevice.getInterfaceCount(); i++) 
            { 
             usbInterface = printerDevice.getInterface(i); 

             if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_PRINTER) 
              { 
               // usbInterface = mDevice; 
              } 
            } 

           UsbEndpoint endPoint = usbInterface.getEndpoint(0); 
           conn = mUsbManager.openDevice(mDevice); 
           conn.claimInterface(usbInterface, true); 

           String myStringData = "TEXT"; 
           myStringData += "\n"; 
           byte[] array = myStringData.getBytes(); 
           ByteBuffer output_buffer = ByteBuffer.allocate(array.length); 
           UsbRequest request = new UsbRequest(); 
           request.initialize(conn, endPoint); 
           request.queue(output_buffer, array.length); 
           if (conn.requestWait() == request) 
            { 
             Log.i("Info", output_buffer.getChar(0) + ""); 
             Message m = new Message(); 
             m.obj = output_buffer.array(); 
             output_buffer.clear(); 
            } 
           else 
            { 
             Log.i("Info", "No request recieved"); 
            } 
           int transfered = conn.bulkTransfer(endPoint, myStringData.getBytes(), myStringData.getBytes().length, 5000); 
           Log.i("Info", "Amount of data transferred : " + transfered); 

          } 
         catch (Exception e) 
          { 
           Log.e("Exception", "Unable to transfer bulk data"); 
           e.printStackTrace(); 
          } 
         finally 
          { 
           try 
            { 
             conn.releaseInterface(usbInterface); 
             Log.i("Info", "Interface released"); 
             conn.close(); 
             Log.i("Info", "Usb connection closed"); 
             unregisterReceiver(mUsbReceiver); 
             Log.i("Info", "Brodcast reciever unregistered"); 
            } 
           catch (Exception e) 
            { 
             Log.e("Exception", "Unable to release resources because : " + e.getMessage()); 
             e.printStackTrace(); 
            } 
          } 

        } 
      }); 
    } 

private void print(UsbDeviceConnection connection, UsbInterface intrface) 
    { 
     String test = "THIS IS A PRINT TEST"; 
     // String text = "#move " + protocol + ";" + "#print" + test; 
     // Log.e("text", text); 
     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); 

     connection.close(); 
    } 
+0

Penso che potrebbe essere necessario avviare una taglia per questa domanda ... – DJphy

risposta

0

Ho avuto questo comportamento esatto da altri sistemi operativi, quando il produttore della stampante utilizza un (:-(e non descritto) protocollo proprietario sul bus USB. In particolare, la serie HP Laserjet P1060 viene in mente. Sia con GNU/Linux che con Mac OS-X, il sistema operativo rileva abbastanza bene la stampante e tenta di stampare utilizzando un driver generico (ad esempio, HP Laserjet II). Il LED della stampante inizia a lampeggiare, ma non viene visualizzato nulla. se mancava qualche comando per fare in modo che la stampante stampasse effettivamente la pagina

In questi casi, era necessario scaricare un blob del firmware proprietario per far funzionare le cose. Sfortunatamente, potrebbe essere difficile trovare un tale driver per A ndroid per modelli di stampanti per la casa/piccole imprese. Ho avuto un po 'di fortuna con l'applicazione di stampa mobile Samsung (http://www.samsung.com/us/mobile-print-app/) con le stampanti laser in rete decentrate (ML 3471-ND e simili). Questo era su Wifi + Ethernet.

HTH.

0

Dalla tua descrizione tutto sembra funzionare: il trasferimento dei dati sta avvenendo, non ci sono errori ma la stampa non produce nulla. Forse perché la stampante Samsung è una stampante per pagine e il codice che hai è buono per la stampa in linea (stampanti Pos e Dot Matrix). In tal caso, i dati risiederanno nel buffer di stampa in attesa che la pagina venga completata. Prova a forzare una pagina per completare pubblicando un formfeed e controlla.

Problemi correlati