简体   繁体   English

蓝牙文件传输Android

[英]Bluetooth file transfer Android

I am facing a problem in sending large files over bluetooth sockets. 我在通过蓝牙套接字发送大文件时遇到问题。 Smaller files get transferred correctly. 较小的文件可以正确传输。 I believe upto 161280 bytes get transferred correctly. 我认为最多可以正确传输161280字节。

EDIT: I did some more testing and narrowed down the cause. 编辑:我做了更多的测试,并缩小了原因。 It seems that 看起来

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

in the sending code part is NOT writing more than 161280 bytes. 在发送代码部分中写入的内容不超过161280个字节。 I saw this behavior by not closing the socket connection, thereby causing the read in the receiving part to "block" on 161280 bytes. 我没有关闭套接字连接,从而导致接收部分中的read在161280字节上“阻塞”,从而看到了此行为。 What is wrong with the bluetooth output stream here? 此处的蓝牙输出流有什么问题? What am I doing wrong? 我究竟做错了什么?

EDIT 2: Doing this lets it through. 编辑2:这样做可以通过。

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

Sending code: 发送代码:

    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();

Receiving code: 接收代码:

// 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: 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)

I am using Motorola Milestone. 我正在使用Motorola Milestone。 Android 2.1 Android 2.1

I was able to solve this problem by sending small chunks of data out to the bluetooth outstream. 通过将一小部分数据发送到蓝牙下游,我能够解决此问题。 It turned out that 8 * 1024 was a good buffer size, which helped in sending out data seamlessly over the stream as well as preventing corruption of data at the receiving end. 事实证明,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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM