この問題の解決策が見つかりません: Android でプログラムを作成して、写真 (jpg 形式) を撮影し、Bluetooth チャネルを介して Embedded Windows XP PC に送信しました。また、画像を受け取る Windows 用の C++ アプリケーションも作成しました。
通信は、Bluetooth ソケットを使用して実装されます。Android では、アプリは 1024 バイトのチャンクでファイルを読み取り、画像が終了するまですべてのチャンクをソケットに書き込みます。Windows 側では、recv(...) 関数が値 > 0 を返すまで、1024 バイトのチャンクでバイトを読み取ります。
その結果、Android 側ではすべてのバイトが正しく読み取られて送信されたように見えますが、Windows 側では (ほぼ) バイトの 70 ~ 80% しか受信しません。jpg を視覚化できるため、受信した正しいバイトを確認することもできます (画像の下部にある不足しているバイトは灰色で表示されます)。全体像を受け取ることはめったにありません。ここに、Android 側のコードの関連部分を投稿します。
String picturePath = "/sdcard/VERDE/PTR-0_15-31-24.jpg";
File picture = new File(picturePath);
if (picture.exists())
{
Log.d(TAG, "File " + picture.getAbsolutePath() + " exists!");
try
{
FileInputStream fis = new FileInputStream(picture);
ostream = socket.getOutputStream();
byte[] buf = new byte[1024];
int read = 0;
int totBytes = 0;
while ((read = fis.read(buf)) != -1)
{
totBytes = totBytes + read;
ostream.write(buf, 0, read);
Log.d(TAG, "Image - Read: " + read + " - Total "
+ totBytes + " bytes!");
}
ostream.flush();
ostream.close();
fis.close();
} catch (UnknownHostException ex)
{
System.out.println(ex.getMessage());
} catch (IOException ex)
{
System.out.println(ex.getMessage());
}
} else
{
Log.d(TAG, "File " + picture.getAbsolutePath()
+ " does not exist!");
}
これは、C++ アプリケーションのコードの関連部分です。
if (_outFile != NULL)
{
_outFile.open(result.c_str(), ofstream::binary); //"pic.jpg"
cout << "File opened!" << endl;
} else
{
cout << "Can't open file!" << endl;
}
while ((received = recv(client, buf, sizeof(buf), 0)) > 0)
{
cout << "R:" << received << " ";
if (received > 0)
{
totalBytes += received;
if (_outFile.is_open())
{
_outFile.write(buf, received);
cout << " (Total: " << totalBytes << " B)" << endl;
} else
cout << "Error in recv() function, received bytes = "
<< received << endl;
} else
cout << "R:" << received << " ";
}
このトピックに関する何十ものブログや投稿を見てきましたが、誰も同様の問題を抱えているようには見えません! アイデアがあれば助けてください!
ありがとう!