如何清空与安卓平板电脑的 MTP 连接?

4
我使用USB电缆将三星Galaxy Android平板连接到运行Windows 7的计算机上,它使用MTP进行连接。
步骤1:通过Windows资源管理器将我的SQLite数据库从Windows 7复制到平板电脑。 步骤2:在平板电脑上打开它(这会添加android_metadata表),然后关闭它。 步骤3:将SQLite数据库复制回Windows。 步骤4:使用sqlite3.exe检查它。 它已损坏。
现在是另一个测试。
步骤1:通过Windows资源管理器将我的SQLite数据库从Windows 7复制到平板电脑。 步骤2:断开连接,然后重新连接USB电缆。 步骤3:在平板电脑上打开它(这会添加android_metadata表),然后关闭它。 步骤4:将SQLite数据库复制回Windows。 步骤5:使用sqlite3.exe检查它。 它没有损坏。
有趣的是,如果我交换步骤2和3,它也可以工作。
由于当我断开并重新连接USB电缆时它可以正常工作,因此我猜想我需要以某种方式清除MTP缓存。 如何实现这一点,或者是否有API可以用来快速断开和重新连接设备?
我的实际Windows应用程序使用WPD(Windows便携式设备)API,我只是使用Windows资源管理器进行测试,以证明这不是我的Windows代码的问题。 我在WPD中没有看到任何可以执行清除操作的内容。
当Android上的SQLite数据库增加一页(或更多)时,错误似乎会发生。 SQLite中的页面大小为512字节。 查看SQLite数据库的二进制数据,我可以看到发生了什么。 我在设备上使数据库变大一页,将数据库复制到设备外,拔掉USB电缆,重新插入它,然后再次复制它。 比较两个文件,我得到的文件与上次复制文件时相同,只是在结尾处有更多的数据。 看起来MTP在你拔下USB电缆并重新插入之前不会理解文件变大。 如果你让USB保持连接状态,它只会复制上次复制文件时的字节数。

你找到解决方法了吗?我面临着同样的问题,只不过对于Galaxy Nexus我实际上必须重新启动手机才能刷新。 - Matt
不行,我们放弃了并转向了基于WiFi的连接。 - mhenry1384
在文件传输期间或之前之后,设备上是否有任何进程正在锁定或修改该文件? - Jason Harrison
2个回答

0

使用Windows的这个函数,如DELPHI示例所示。


procedure shCopyFile(hWndOwner: HWND; const SourceFile, TargetFile: string);

var Info : TSHFileOpStruct;
Aborted : Bool;

begin
Aborted := False;

with Info do
begin
Wnd := hWndOwner;
wFunc := FO_COPY;

// 来自微软帮助文档:
// wFunc = 要执行的操作。 此成员可以是以下值之一:
// FO_COPY 将pFrom指定的文件复制到由pTo指定的位置。
// FO_DELETE 删除pFrom指定的文件(忽略pTo)。
// FO_MOVE 将pFrom指定的文件移到由pTo指定的位置。
// FO_RENAME 重命名pFrom指定的文件。

pFrom := pChar(源文件);
pTo := pChar(目标文件);
fFlags := 0;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOERRORUI;
fAnyOperationsAborted := 已取消;
end;
try
SHFileOperation(信息);
finally
如果已取消 then; 处理任何用户取消
end;
end;

我正在将文件从桌面复制到Android MTP设备路径

Stefano www.data-ware.it


0

我在 Samsung Galaxy Tab 2 7.0 上发现了完全相同的问题。

但在我看来,这是安卓系统的问题。

如果我强制停止打开数据库的应用程序(系统设置->应用管理器->我的应用程序->强制停止),那么它就可以正常工作。

仅仅“打开连接”和“关闭连接”是不够的。整个安卓端的进程必须被关闭。

这就解释了为什么在重启设备后它能正常工作。


进一步调查: 它在Galaxy Tab和4.1.2上完美运行(如果App进程关闭)。 它可以使用MTP但不能使用PTP(图片传输协议)。 两种协议都使用WPD功能连接,但是PTP在写入和读取时非常不一致(因此永远不要使用PTP)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接