4

SamsungGalaxyAndroidタブレットをUSBケーブルでWindows7を実行しているコンピューターに接続します。MTPを使用して接続します。

  • ステップ1.Windowsエクスプローラーを介してWindows7からタブレットにSQLiteデータベースをコピーします。
  • 手順2.タブレットで開き(android_metadataテーブルが追加されます)、閉じます。
  • ステップ3.SQLiteデータベースをWindowsにコピーして戻します。
  • ステップ4.sqlite3.exeを使用して確認します。壊れています。

今度は別のテスト。

  • ステップ1.Windowsエクスプローラーを介してWindows7からタブレットにSQLiteデータベースをコピーします
  • 手順2.USBケーブルを取り外してから再接続します。
  • 手順3.タブレットで開き(android_metadataテーブルが追加されます)、閉じます。
  • ステップ3.SQLiteデータベースをWindowsにコピーして戻します。
  • ステップ4.sqlite3.exeを使用して確認します。破損していません。

興味深いことに、手順2と3を切り替えると、それも機能します。

USBケーブルを外して再接続すると動作するので、どういうわけかMTPキャッシュをフラッシュする必要があると思います。これをどのように達成できますか、またはデバイスをすばやく切断して再接続するために使用できるAPIはありますか?

私の実際のWindowsアプリケーションはWPD(Windows Portable Devices)APIを使用しています。Windowsエクスプローラーを使用してテストしているだけで、Windowsコードに問題がないことを証明しています。フラッシュを実行するためのWPDには何も表示されません。

このエラーは、Android上のSQLiteデータベースが1ページ(またはそれ以上)大きくなると発生するようです。SQLiteのページサイズは512バイトです。SQLiteデータベースのバイナリデータを見ると、何が起こっているのかがわかります。デバイス上でデータベースを1ページ大きくし、データベースをデバイスからコピーし、USBを取り外し、プラグを差し込んでから、もう一度コピーします。2つのファイルを比較すると、usbデータをコピーした後に取得するファイルは、最後に多くのデータがあることを除いて同じです。USBを取り外して再度接続するまで、MTPはファイルが大きいことを理解しないようです。USBを接続したままにすると、最後にファイルをコピーしたときに存在していたバイト数だけがコピーされます。

4

2 に答える 2

0

この DELPHI の例に示すように、ウィンドウのこの機能を使用します。


プロシージャ shCopyFile(hWndOwner: HWND; const SourceFile, TargetFile: string);

var 情報: TSHFileOpStruct;
中止: ブール;

中止を開始します
:= False;

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

// Microsoft のヘルプから:
// wFunc = 実行する操作。このメンバーは、次のいずれかの値になります。
// FO_COPY pFrom で指定されたファイルを pTo で指定された場所にコピーします。
// FO_DELETE pFrom で指定されたファイルを削除します (pTo は無視されます)。
// FO_MOVE pFrom で指定されたファイルを pTo で指定された場所に移動します。
// FO_RENAME pFrom で指定されたファイルの名前を変更します。

pFrom := pChar(ソースファイル);
pTo := pChar(TargetFile);
fFlags := 0;
fFlags := FOF_SILENT または FOF_NOCONFIRMATION または FOF_NOERRORUI;
fAnyOperationsAborted := 中止されました。
終わり; SHFileOperation(情報);
を試してください。 最後に


中止された場合;
ユーザーのキャンセルが終了したときに制定します。
終わり;

デスクトップから Android MTP デバイスの PATH にファイルをコピーしています

ステファノ www.data-ware.it

于 2012-03-10T15:27:22.990 に答える
0

Samsung Galaxy Tab 2 7.0 でもまったく同じ問題が見つかりました。

しかし、私の意見では、それはアンドロイド側の問題です。

データベースを開くアプリケーションを強制的に停止すると(システム設定->アプリマネージャー->マイアプリ->強制停止)、機能します。

「接続を開く」と「接続を閉じる」だけでは十分ではありません。Android 側の完全なプロセスを閉じる必要があります。

これは、デバイスの再起動後に機能する理由を説明しています。


詳細な調査: Galaxy Tab および 4.1.2 で完全に動作します (App-process が閉じている場合)。MTP では動作しますが、PTP (Picture Transfer Protocol) では動作しません。どちらのプロトコルも WPD 機能で接続していますが、PTP は書き込み時と読み取り時にかなり一貫性がありません (したがって、決して PTP を使用しないでください)。

于 2013-04-18T12:34:13.967 に答える