与Android平板电脑刷新MTP连接?

时间:2012-02-02 15:59:05

标签: android sqlite wpd mtp

我将带有USB线的Samsung 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表),然后关闭它。
  • 步骤3.将SQLite数据库复制回Windows。
  • 步骤4.使用sqlite3.exe进行检查。它没有腐败。

有趣的是,如果我改变第2步和第3步,它也会有效。

因为当我断开并重新连接USB电缆时它工作,我猜我需要以某种方式刷新MTP缓存。如何实现这一目标,或者是否有可用于快速断开和重新连接设备的API?

我的实际Windows应用程序使用WPD(Windows便携设备)API,我只是使用Windows资源管理器进行测试,以证明它在我的Windows代码中不是问题。我在WPD中看不到任何冲洗。

当Android上的SQLite数据库增长一页(或更多)时,似乎会发生错误。 SQLite中的页面大小为512字节。查看SQLite数据库的二进制数据,我可以看到发生了什么。我在设备上将数据库放大一页,将数据库从设备上复制下来,拔掉USB插头,插上电源,然后再将其复制掉。比较这两个文件,我复制usb数据后得到的文件是相同的,除了它最后有更多的数据。这就像MTP不明白文件更大,直到你拔掉usb并重新插入它。如果你把USB插入,它只会复制上次复制文件时的字节数。

2 个答案:

答案 0 :(得分:0)

使用Windows的此功能 如DELPHI示例所示。


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

var Info:TSHFileOpStruct;
    流产:Bool;

开始
  中止:=假;

用信息做   开始
    Wnd:= hWndOwner;
    wFunc:= FO_COPY;

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

    pFrom:= pChar(SourceFile);
    pTo:= pChar(TargetFile);
    fFlags:= 0;
    fFlags:= FOF_SILENT或FOF_NOCONFIRMATION或FOF_NOERRORUI;
    fAnyOperationsAborted:=已中止;
  端;
  尝试
    SHFileOperation(信息);
  最后
    如果中止了;制定任何用户取消
  端;
端;

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

斯特凡诺 www.data-ware.it

答案 1 :(得分:0)

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

但在我看来,这是android方面的一个问题。

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

仅“开放连接”和“关闭连接”是不够的。 必须关闭android端的完整过程。

这解释了重启设备后它的工作原理。


进一步调查: 它与Galaxy Tab和4.1.2完美配合(如果App-process关闭)。 它适用于MTP但不适用于PTP(图片传输协议)。 两种协议都与WPD功能连接,但PTP在写入和读取时非常不一致(所以永远不要使用PTP)。