gpt4 book ai didi

c# - 如何使用 USB 和/或 WPD 将文件从 Android 设备传输到 PC

转载 作者:搜寻专家 更新时间:2023-11-01 08:44:00 25 4
gpt4 key购买 nike

我正在尝试通过电缆将 android 设备连接到(Windows 7 64 位)PC,然后以编程方式将一些文件从 android 检索到 pc。

(注意:我需要这个用于特定设备,Moverio BT-200,我遇到了驱动程序问题;所以不要建议使用 adb ;-)我知道那是简单快捷的方法,但不可行)

我发现我的设备可以被视为 Windows 便携设备 (WPD)。我在 C# 中找到了一些非常好的代码示例,使我能够 detect WPDs , 至 enumerate their contents , 和 transfer the contents .我还在 C++ 中找到了一些代码,它执行 all of the above and much more .只要我连接一个 sdcard 或一个 usb key (即:只要我有一个设备可以被 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);

但我无法弄清楚这些十进制值是如何工作的。在线文档似乎很少。我在设备管理器 ({eec5ad98-8080-425f-922a-dabf3de3f69a}
),但每次我尝试用我自己的替换其中一个 guid 时,我都会收到 COMException。

我找对地方了吗?我是否需要设置一些 GUID 或其他东西?

我将这个问题标记为 C# 和 C++,因为我在这两种语言中找到了一些代码示例,但我愿意用任何语言(java、python、...)解决问题

最佳答案

郑重声明,我最终使用了一些可怕的 hack 来解决我的问题。因为我知道存储我要查找的文件的路径,所以我使用了 Christophe Geer 博客中的 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);

关于c# - 如何使用 USB 和/或 WPD 将文件从 Android 设备传输到 PC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30137503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com