2015-04-15 33 views
4

我有一个桌面Java应用程序,也是一个Android应用程序。两个应用程序一起工作通过USB桌面java应用程序复制和传输android数据

桌面应用程序中的用户有一个按钮来启动设备数据应用程序到计算机应用程序之间的传输,反之亦然。

因此,我需要用简单的USB电缆传输数据,并且没有互联网连接/ WiFi /蓝牙/ adb。

我发现了两个Java MTP库在Windows上运行,以解决我的问题,而Android的USB Host/accesory fonctionnality:

  • jMTP成功地识别出我的Android设备,文件夹,和其他的东西

    我有成功转让在计算机中的文件--->设备,但我有一个错误,当我尝试在设备--->计算机

    我把我的代码EXP后传输文件laination。

  • jusbpmp但我没有可能转移设备--->计算机。

  • USB主机/ accesory不是有用,因为转移是从桌面应用程序启动,而当我在Android developper指南网站上阅读,它似乎没有从我所需要的,或者对应也许,如果用户开始转移从设备。

我尝试从1周成功完成这项任务,但似乎我需要帮助。

的Java + jMTP代码

private static void jMTPeMethode() 
     { 
      PortableDeviceManager manager = new PortableDeviceManager(); 
      PortableDevice device = manager.getDevices()[0]; 
      // Connect to USB tablet 
      device.open(); 

      System.out.println(device.getModel()); 

      System.out.println("---------------"); 

      // Iterate over deviceObjects 
      for (PortableDeviceObject object : device.getRootObjects()) 
      { 
       // If the object is a storage object 
       if (object instanceof PortableDeviceStorageObject) 
       { 
        PortableDeviceStorageObject storage = (PortableDeviceStorageObject) object; 

        for (PortableDeviceObject o2 : storage.getChildObjects()) 
        { 
         if(o2.getOriginalFileName().equalsIgnoreCase("Test")) 
         { 

          //Device to computer not working 
          PortableDeviceToHostImpl32 copy = new PortableDeviceToHostImpl32(); 
          try 
          { 
           copy.copyFromPortableDeviceToHost(o2.getID(), "C:\\TransferTest", device); 
          } catch (COMException ex) 
          { 

          } 

    //      //Host to Device working 
    //      BigInteger bigInteger1 = new BigInteger("123456789"); 
    //      File file = new File("c:/GettingJMTP.pdf"); 
    //      try { 
    //       storage.addAudioObject(file, "jj", "jj", bigInteger1); 
    //      } catch (Exception e) { 
    //       //System.out.println("Exception e = " + e); 
    //      } 
         } 
         System.out.println(o2.getOriginalFileName()); 
        } 
       } 
      } 

      manager.getDevices()[0].close(); 
     } 

这是代码和错误

` 

    Nexus 9 
    --------------- 
    Music 
    Podcasts 
    Ringtones 
    Alarms 
    Notifications 
    Pictures 
    Movies 
    Download 
    DCIM 
    Android 
    ! Failed to get IStream (representing object data on the device) from IPortableDeviceResources, hr = 0x80070057 
    test 
    ReleveData 

` 

我在网上读80070057的结果是一个通用的窗口例外。

编辑:

Windows site say为HR错误 ERROR_INVALID_PARAMETER 80070057: 由应用程序提供的参数是无效的。

但我没有看到女巫参数无效


这里是C类的库使用了传输数据的设备计算机的link,你可以看到我的错误行230

这是我使用的jMTP库。

你能帮助我,还是以另一种方式去做我需要的东西(Usb4Java,libUSB)?我会很感激。

提前致谢。

回答

6

好吧,我发现了这个问题。

问题来自o2.getID()参数给予方法copy.copyFromPortableDeviceToHost

因为o2代表文件夹,而不是文件夹中的文件,所以它不可能发送文件夹,为了成功我需要发送文件夹中的文件。

所以我投我PortableDeviceObject O2到PortableDeviceFolderObject,从而获得子对象的列表,在PortableDeviceFolderObject代表文件的targetFolder.getChildObjects(),然后我可以从文件夹中的所有子OBJET迭代。

而对于每个文件我称为方法copy.copyFromPortableDeviceToHost,与正确的ID。

这里是校正码,从计算机到设备和设备到计算机的复制/传输文件。

我希望这是帮助。

public class USBTransfertMain { 

    public static void main(String[] args) throws Throwable { 
     jMTPeMethode(); 
    } 

    private static void jMTPeMethode() 
    { 
     PortableDeviceFolderObject targetFolder = null; 
     PortableDeviceManager manager = new PortableDeviceManager(); 
     PortableDevice device = manager.getDevices()[0]; 
     // Connect to USB tablet 
     device.open(); 
     System.out.println(device.getModel()); 

     System.out.println("---------------"); 

     // Iterate over deviceObjects 
     for (PortableDeviceObject object : device.getRootObjects()) 
     { 
      // If the object is a storage object 
      if (object instanceof PortableDeviceStorageObject) 
      { 
       PortableDeviceStorageObject storage = (PortableDeviceStorageObject) object; 

       for (PortableDeviceObject o2 : storage.getChildObjects()) 
       { 
        if(o2.getOriginalFileName().equalsIgnoreCase("testFolder")) 
        { 
         targetFolder = (PortableDeviceFolderObject) o2; 
        } 

        System.out.println(o2.getOriginalFileName()); 
       } 

       copyFileFromComputerToDeviceFolder(targetFolder); 
       PortableDeviceObject[] folderFiles = targetFolder.getChildObjects(); 
       for (PortableDeviceObject pDO : folderFiles) { 
        copyFileFromDeviceToComputerFolder(pDO, device); 
       } 

      } 
     } 

     manager.getDevices()[0].close(); 
    } 

    private static void copyFileFromDeviceToComputerFolder(PortableDeviceObject pDO, PortableDevice device) 
    { 
     PortableDeviceToHostImpl32 copy = new PortableDeviceToHostImpl32(); 
     try { 
      copy.copyFromPortableDeviceToHost(pDO.getID(), "C:\\TransferTest", device); 
     } catch (COMException ex) { 
      ex.printStackTrace(); 
     } 

    } 

    private static void copyFileFromComputerToDeviceFolder(PortableDeviceFolderObject targetFolder) 
    { 
     BigInteger bigInteger1 = new BigInteger("123456789"); 
     File file = new File("C:\\GettingJMTP.pdf"); 
     try { 
      targetFolder.addAudioObject(file, "jj", "jj", bigInteger1); 
     } catch (Exception e) { 
      System.out.println("Exception e = " + e); 
     } 
    } 
} 
相关问题