2015-05-09 165 views
2

我试图通过电缆将Android设备连接到一个(64位Windows 7)PC,然后从Android编程方式检索一些文件到PC。 (注:我需要一个特定的设备,Moverio BT-200,并且我遇到了驱动程序问题;所以不建议使用adb ;-)我知道这是简单和快速的方式,但它不是可行)如何将文件从Android设备使用USB传输到PC和/或WPD

我发现,我的设备可以被看作是一个Windows便携式设备(WPD)。我在C#中找到了一些非常好的代码示例,它使我可以使用detect WPDs,enumerate their contentstransfer the contents。我还在C++中找到了一些代码,其代码为all of the above and much more。所有这些例子的作用就像一个魅力,只要我连接一个单一的SD卡或一个USB密钥(即:只要我有一个设备被Windows识别并获得一个字母作为正确的驱动器),我得到目前文件的完整列表及其绝对路径。但是,如果我尝试连接Android设备,并列出内容,我得到的东西,我不明白:

embt2 
SD Card 
o15F9A 
o15F9B 
o15F9C 
o15F9D 
o15F9E 
...etc 
Internal Storage 
o1 
o2 
o3 
o4 
o5 
o6 
oD1F 
oD20 
oD24 
o7 
o8 
o1E78 
o9 
...etc 

这怎么可能?浏览C#代码(第二个链接,上面),我发现,在某些点,代码创建了几个GUID对象,每个都与一些稍有不同的参数:

// Identify the property to retrieve 
var property = new _tagpropertykey(); 
property.fmtid = new Guid(0x26D4979A, 0xE643, 0x4626, 0x9E, 0x2B, 
             0x73, 0x6D, 0xC0, 0xC9, 0x2F, 0xDC); 
property.pid = 12; 

[...] 

// Get the name of the object 
string name; 
var property = new _tagpropertykey(); 
property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 
            0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C); 
property.pid = 4; 

[...] 

// Get the type of the object 
property = new _tagpropertykey(); 
property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 
            0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C); 
property.pid = 7; 

[...] 

var folderType = new Guid(0x27E2E392, 0xA111, 0x48E0, 0xAB, 0x0C, 
            0xE1, 0x77, 0x05, 0xA0, 0x5F, 0x85); 
var functionalType = new Guid(0x99ED0160, 0x17FF, 0x4C44, 0x9D, 0x98, 
             0x1D, 0x7A, 0x6F, 0x94, 0x19, 0x21); 

但我无法弄清楚如何将这些exadecimal值工作。网上的文件似乎很少。我发现我的设备guid与设备管理器({eec5ad98-8080-425f-922a-dabf3de3f69a} ),但每次我试图用我自己的GUID替换之一,我得到一个COMException。

我是否找对了地方?我需要设置一些GUID还是其他?

我标记这个问题,C#和C++,因为我发现这两种语言的一些代码示例,但我愿意解决任何语言问题(使用Java,Python,...)

+0

我不认为所显示的代码可以编译,因为它重新声明了名称“property”。无论如何,它只是创建'Guid'对象。阅读Wikipedia中的GUID。 –

+0

@Cheers这不是确切的代码:我只是复制粘贴来自原始项目中不同位置的代码块。阅读第二个链接以获得完整的解释。 (是的,它会编译,因为这是一段精确的代码,只是覆盖相同的变量)。我真的不认为维基百科页面可以解决我的问题。所有的GUID都是我的猜测,我不确定我的问题在那里。 – ocramot

+0

*如果它不是用于多个“var”,它会进行编译。我的错。 – ocramot

回答

1

为了记录,我最终使用了一些可怕的黑客来解决我的问题。 因为我知道在哪里存储我找,我从克里斯托夫吉尔的博客使用的功能EnumerateContent文件,并修改了路径,以检查是否当前文件夹中有我在寻找的名字:

如果,例如,我感兴趣的文件是在Sd Card/path/to/directory/,然后我适应这样的代码:而不是调用方法EnumerateContents,我调用该方法EnumerateContentsInTargetDirectory

private static void EnumerateContentsInTargetDirectory(ref IPortableDeviceContent content, PortableDeviceFolder parent) 
{ 
    // Get the properties of the object 
    IPortableDeviceProperties properties; 
    content.Properties(out properties); 

    // Enumerate the items contained by the current object 
    IEnumPortableDeviceObjectIDs objectIds; 
    content.EnumObjects(0, parent.Id, null, out objectIds); 

    uint fetched = 0; 
    do 
    { 
     string objectId; 

     objectIds.Next(1, out objectId, ref fetched); 
     if (fetched > 0) 
     { 
      var currentObject = WrapObject(properties, objectId); 

      if (currentObject is PortableDeviceFolder) 
      { 
       if (currentObject.Name.Equals("SD Card") || currentObject.Name.Equals("path") || currentObject.Name.Equals("to")) 
       { 
        parent.Files.Add(currentObject); 
        EnumerateContentsInTargetDirectory(ref content, (PortableDeviceFolder)currentObject); 
       } 
       else if (currentObject.Name.Equals("directory")) 
       { 
        parent.Files.Add(currentObject); 
        // This is the same original method of Christophe Geer. 
        EnumerateContents(ref content, (PortableDeviceFolder)currentObject); 
       } 
      } 
     } 
    } while (fetched > 0); 

}

1

什么与所有奇怪的文件名?你贴了很多与o后跟一个十六进制数字开头的条目的第一个单子都是PTP/MTP物品惟一标识符,让你可以参考文件的远程设备上的项目。这些都是正常的并且是PTP和MTP协议的一部分,它们是PTP和MTP协议中全部项目枚举和文件传输系统的许多数据片段之一。

什么是与所有的GUID和细微变化的交易吗?这基本上是USB HID(硬件识别)协议在封面下的工作原理 - 具体说明Microsoft如何实现它。 GUID是Microsoft代码,链接到USB驱动程序中的HID路径,然后调用USB设备获取信息(获取或设置信息)。每个HID命令还使用PID(产品标识符)来寻址HID路径或命令中的特定内存位置,因此在HID命令中传递不同的PID会导致在USB设备上获取/设置不同的数据。

什么是有点悲哀和可怕的是微软如何揭露了这个非常低级的互动达到高水平的工程师和程序。他们的文档并没有提供很多有用的背景信息或解释这些东西是什么和手段。如果你想要更多可靠的示例代码和背景,我强烈建议检查Christophe Geer's blogs关于在C#/ .Net中使用WPD - 他们真的帮了我很多。看到他的follow-up blog on transferring content更多的好东西。

另一条建议可能会有所帮助 - 您可以在整个PID范围内找到哪些信息。只要包装你的偷看和戳在try/catch块,以防他们失败。我为来自Christophe Geer的代码构建了一个额外的小窍门,在他的示例中窥探了所有HID GUID的PID 0-31,并发现了大量额外且有用的信息。

+0

嗨tpartee,谢谢!你的回答并没有真正帮我解决我的问题,但肯定包含了很多有趣的信息! (除了这两个链接,你可能没有注意到,我已经把它们自己链接起来了,在我的第一个问题中;-))。谢谢你的时间。我已经解决了一些可怕的黑客攻击。 – ocramot

+1

这让我很难过,但整个系统对微软来说似乎是一个可怕的破解。所以任何能够发挥作用的东西都必然会成为黑客。 ;)目前我试图找到一个解决方法的最大问题是,Windows WPD和WIA似乎只能够支持USB 1.0速度 - 连接USB 3.0设备和电缆不会提高速度。 = / – tpartee

相关问题