Флеш MTP-соединение с планшетом Android?

Я подключаю планшет Samsung Galaxy Android с помощью USB-кабеля к компьютеру под управлением Windows 7. Он подключается с помощью MTP.

  • Шаг 1. Скопируйте базу данных SQLite из Windows 7 на планшет через Windows Explorer.
  • Шаг 2. Откройте его на планшете (который добавляет таблицу android_metadata), а затем закройте его.
  • Шаг 3. Скопируйте базу данных SQLite обратно в Windows.
  • Шаг 4. Проверьте это с помощью sqlite3.exe. Это коррумпировано.

Теперь еще один тест.

  • Шаг 1. Скопируйте базу данных SQLite из Windows 7 на планшет через Windows Explorer
  • Шаг 2. Отключите и снова подключите USB-кабель.
  • Шаг 3. Откройте его на планшете (который добавляет таблицу android_metadata), а затем закройте его.
  • Шаг 3. Скопируйте базу данных SQLite обратно в Windows.
  • Шаг 4. Проверьте это с помощью sqlite3.exe. Это НЕ коррумпировано.

Интересно, что если я переключу шаги 2 и 3, это также работает.

Поскольку он работает, когда я отсоединяю и снова подключаю USB-кабель, я предполагаю, что мне нужно как-то очистить кэш MTP. Как это можно сделать, или есть API, который я могу использовать для быстрого отключения и повторного подключения устройства?

Мое настоящее приложение Windows использует API-интерфейс WPD (Windows Portable Devices), я просто тестирую с помощью Windows Explorer, чтобы убедиться, что это не проблема в моем коде Windows. Я не вижу ничего в WPD, чтобы сделать флеш.

Кажется, ошибка возникает, когда база данных SQLite на Android увеличивается на страницу (или больше). Размер страницы в SQLite составляет 512 байт. Глядя на двоичные данные базы данных SQLite, я вижу, что происходит. Я делаю базу данных на одну страницу больше на устройстве, копирую базу данных с устройства, отключаю usb, подключаю ее, затем снова копирую. Сравнивая эти два файла, файл, который я получаю после того, как копирую данные с usb, такой же, за исключением того, что в конце он содержит гораздо больше данных. Как будто MTP не понимает, что файл больше, пока вы не отключите USB и не подключите его снова. Если вы оставляете USB подключенным, он копирует только те байты, которые были там при последнем копировании файла.

2 ответа

Я нашел точно такую ​​же проблему на Samsung Galaxy Tab 2 7.0.

Но по моему мнению это проблема на стороне Android.

Если я принудительно остановлю приложение, открывающее базу данных (Системные настройки-> Диспетчер приложений-> Мое приложение-> Принудительная остановка), оно будет работать.

Только "открытое соединение" и "закрытое соединение" недостаточно. Весь процесс на стороне андроида должен быть закрыт.

Это объясняет, почему он работает после перезагрузки устройства.


Дальнейшее исследование: отлично работает с Galaxy Tab и 4.1.2 (если App-процесс закрыт). Он работает с MTP, но не с PTP (протокол передачи изображений). Оба протокола соединяются с WPD-функцией, но PTP довольно непоследователен при записи и чтении (поэтому никогда не используйте PTP).

Используйте эту функцию окон, как показано в этом примере DELPHI.


процедура shCopyFile(hWndOwner: HWND; const SourceFile, TargetFile: строка);

var Info: TSHFileOpStruct;
Прервано: Bool;

начать
Прервано:= Неверно;

с инфо сделать
начать
Wnd:= hWndOwner;
wFunc:= FO_COPY;

// Из справки Microsoft:
// 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

Другие вопросы по тегам