Bluetooth для передачи файлов Android - PullRequest
8 голосов
/ 17 марта 2012

У меня проблема с отправкой больших файлов через Bluetooth-сокеты.Меньшие файлы передаются правильно.Я считаю, что до 161280 байтов передаются правильно.

РЕДАКТИРОВАТЬ: Я сделал еще несколько испытаний и сузил причину.Кажется, что

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

в части кода отправки НЕ записывает более 161280 байтов.Я видел это поведение, не закрывая сокетное соединение, в результате чего read в принимающей части «блокировался» на 161280 байт.Что не так с выходным потоком Bluetooth здесь?Что я делаю не так?

РЕДАКТИРОВАТЬ 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)

Я использую Motorola Milestone.Android 2.1

1 Ответ

2 голосов
/ 17 марта 2012

Мне удалось решить эту проблему, отправив небольшие порции данных на выход Bluetooth.Оказалось, что размер буфера 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);
}
...