【问题标题】:Bluetooth file transfer Android蓝牙文件传输安卓
【发布时间】:2012-04-02 15:25:25
【问题描述】:

我在通过蓝牙套接字发送大文件时遇到问题。较小的文件可以正确传输。我相信最多可以正确传输 161280 个字节。

编辑:我做了更多测试并缩小了原因。看来

outStream.write(mybytearray, 0, mybytearray.length);

在发送代码部分中写入的字节数不超过 161280。我通过不关闭套接字连接看到了这种行为,从而导致接收部分中的read 在 161280 字节上“阻塞”。这里的蓝牙输出流有什么问题?我做错了什么?

编辑 2: 这样做可以让它通过。

for(int i = 0 ; i < mybytearray.length ; i++){
    outStream.write(mybytearray[i]);
}

发送代码:

    try {
        outStream = mBluetoothSocket.getOutputStream();
        Log.d(TAG,"outStream created success!");
    } catch (IOException e) {
        Log.d(TAG,
                "ON RESUME: Output stream creation failed.",
                e);
    }

    File myFile = new File(file_name);
    Log.d(TAG,"file /source.pdf created success!");

    byte[] mybytearray = new byte[(int)myFile.length()];
    Log.d(TAG,"file length() =" + (int)myFile.length());

    FileInputStream fis = new FileInputStream(myFile);
    Log.d(TAG,"fis created");

    BufferedInputStream bis = new BufferedInputStream(fis,1272254 );
    Log.d(TAG,"bis created success");

    bis.read(mybytearray,0,mybytearray.length);
    Log.d(TAG,"ALL Bytes read from bis");

    outStream.write(mybytearray, 0, mybytearray.length);
    Log.d(TAG,"BYTES WRITTEN to OUTSTREAM of socket");


    outStream.flush();
    Log.d(TAG,"bytes flushed");
    outStream.close();

接收代码:

// Attach the i/p stream to the socket
    try {
        InputStream in = socket.getInputStream();
        mIn = in;
        Log.d(TAG, "input stream acquired");

    } catch (IOException e1) {
        e1.printStackTrace();
    }
    // Create output streams & write to file
    FileOutputStream fos = new FileOutputStream(
            Environment.getExternalStorageDirectory()
                    + "/copy.pdf");
    try {
        bytesRead = mIn.read(buffer, 0, buffer.length);
        Log.d(TAG, "bytesRead first time =" + bytesRead);
        current = bytesRead;

        do {
            Log.d(TAG, "do-while -- current: " + current);
            bytesRead = mIn.read(buffer, current,
                    buffer.length - current);
            Log.d(TAG, "bytesRead: =" + bytesRead);

            if (bytesRead >= 0)
                current += bytesRead;
        } while (bytesRead > -1);
    } catch (IOException e) {
        e.printStackTrace();
        Log.d(TAG, "do while end:-- buffer len= "
                + buffer.length + "  current: " + current);

        fos.write(buffer);
        Log.d(TAG, "fos.write success! buffer: "
                + buffer.length + "  current: " + current);

        fos.flush();
        fos.close();
    }
}
socket.close();

Logcat:

D/ReceiveService( 5761): do-while -- current: 155232
D/ReceiveService( 5761): bytesRead: =1008
D/ReceiveService( 5761): do-while -- current: 156240
D/ReceiveService( 5761): bytesRead: =1008
D/ReceiveService( 5761): do-while -- current: 157248
D/ReceiveService( 5761): bytesRead: =1008
D/ReceiveService( 5761): do-while -- current: 158256
D/ReceiveService( 5761): bytesRead: =1008
D/ReceiveService( 5761): do-while -- current: 159264
D/ReceiveService( 5761): bytesRead: =1008
D/ReceiveService( 5761): do-while -- current: 160272
D/ReceiveService( 5761): bytesRead: =1008
D/ReceiveService( 5761): do-while -- current: 161280
W/System.err( 5761): java.io.IOException: Software caused connection abort
W/System.err( 5761):    at android.bluetooth.BluetoothSocket.readNative(Native Method)
W/System.err( 5761):    at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:307)
W/System.err( 5761):    at   android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
W/System.err( 5761):    at com.bt.server.ReceiveService$AcceptThread.run(ReceiveService.java:141)

我正在使用摩托罗拉里程碑。安卓 2.1

【问题讨论】:

  • 粘贴发送设备的日志,包括时间戳。希望发送和接收在单独的线程上完成。
  • 搜索“软件导致连接中止”的 SO。
  • 是的,它们在不同的线程上。不同的手机。发送设备几乎在瞬间发送数据。
  • 嘿,你能发布完整的源代码吗?我也被这个使用蓝牙发送文件的问题困住了。如果您分享您的代码,那么我可以解决我的问题。提前致谢。
  • 嗨,我试过这个代码。但我有一些疑问。1)这里是否使用任何协议将数据从一部手机传输到另一部手机。如果是,使用哪种协议?

标签: android bluetooth file-transfer


【解决方案1】:

我能够通过将小块数据发送到蓝牙外流来解决这个问题。事实证明,8 * 1024 是一个很好的缓冲区大小,这有助于通过流无缝发送数据,并防止接收端的数据损坏。

BufferedInputStream bis = new BufferedInputStream(fis, 8 * 1024);


byte[] buffer = new byte[8192];
int len
while ((len = bis.read(buffer)) != -1) {
    outStream.write(buffer, 0, len);
}

【讨论】:

  • 我在使用蓝牙聊天示例通过蓝牙发送简单图像文件时遇到问题。实际上,我的要求是发送任何文件 oevr 蓝牙。为此,我如何设置缓冲区大小,如何接收小块数据并在接收端合并它。你能把你的代码分享给我吗?
  • 我正在开发一个基于您的方法的解决方案,但我坚持使用 outStream.write(mybytearray, 0, mybytearray.length);,它根本不会将数据写入输出溪流。没有错误,创建的文件大小为 0 字节,并且日志在 bis.read(mybytearray,0,mybytearray.length) 之后立即停止。有什么想法吗?
  • @shiraz 亲爱的设拉子我正在努力传输任何大于 1024 字节的文件。您能否在这里分享您的发送/接收代码以帮助我们正在苦苦挣扎的人?谢谢
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
相关资源
最近更新 更多