2012-03-17 21 views
8

Mam problem z wysyłaniem dużych plików przez gniazda bluetooth. Mniejsze pliki są przesyłane poprawnie. Uważam, że maksymalnie 161280 bajtów zostanie poprawnie przesłanych.Transfer plików przez Bluetooth Android

EDYCJA: Zrobiłem więcej testów i zawęziłem przyczynę. Wydaje się, że w części kodu wysyłającego NIE zapisuje się więcej niż 161280 bajtów. Widziałem to zachowanie, nie zamykając połączenia z gniazdem, powodując w ten sposób, że read w części odbiorczej "blokuje" 161280 bajtów. Co jest nie tak ze strumieniem wyjściowym bluetooth? Co ja robię źle?

EDYCJA 2: Dzięki temu to możliwe.

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

Wysyłanie 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(); 

kod Odbieranie:

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

Korzystam z oprogramowania Motorola Milestone. Android 2.1

+0

Wklej dzienniki urządzenia wysyłającego, w tym znaczniki czasu. Wysyłanie i odbieranie nadziei odbywa się w oddzielnym wątku. –

+0

Seach SO dla "Oprogramowanie spowodowało przerwanie połączenia". –

+0

Tak, są one w osobnych wątkach. Różne telefony. Urządzenie wysyłające wysyła dane niemal natychmiast. – shiraz

Odpowiedz

2

Udało mi się rozwiązać ten problem wysyłając małe porcje danych do bluetooth outstream. Okazało się, że 8 * 1024 było dobrym rozmiarem bufora, co pomogło w bezproblemowym wysyłaniu danych przez strumień, a także zapobieganiu korupcji danych po stronie odbiorczej.

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); 
} 
+1

Mam problem z wysyłaniem prostego pliku obrazu przez Bluetooth przy użyciu próbki czatu bluetooth. Właściwie, moim wymaganiem było wysłanie dowolnego pliku bluetooth oevr. W tym celu mogę ustawić rozmiar bufora, jak otrzymać mały fragment danych i połączyć go po stronie odbiorcy. Mógłbym podzielić się ze mną swoim kodem. –

+0

możesz rzucić okiem na ten http://stackoverflow.com/questions/16954082/send-text-file-using-bluetooth-sockets-in-android – neerajDorle

+0

Opracowuję rozwiązanie oparte na twoim podejściu, ale Utknąłem na outStream.write (mybytearray, 0, mybytearray.length) ;, po prostu nie zapisuje danych do strumienia wyjściowego.Brak błędów, plik jest tworzony z rozmiarem 0 bajtów, a logi zatrzymują się zaraz po bis.read (mybytearray, 0, mybytearray.length). Jakieś pomysły? –