2012-03-17 6 views
8

Sono di fronte a un problema nell'invio di file di grandi dimensioni tramite prese bluetooth. I file più piccoli vengono trasferiti correttamente. Credo che fino a 161280 byte vengano trasferiti correttamente.Trasferimento file Bluetooth Android

MODIFICA: Ho eseguito altri test e limitato la causa. Sembra che

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

nella parte del codice di invio NON stia scrivendo più di 161280 byte. Ho visto questo comportamento non chiudendo la connessione socket, causando così il read nella parte ricevente a "bloccare" su 161280 byte. Cosa c'è di sbagliato con il flusso di uscita bluetooth qui? Che cosa sto facendo di sbagliato?

EDIT 2: Fare questo lascia passare.

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

codice di invio:

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

Codice Ricezione:

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

Sto usando Motorola Milestone. Android 2.1

+0

Incollare i registri del dispositivo di invio, compresi i timestamp. Spero che l'invio e la ricezione avvengano su un thread separato. –

+0

Seach SO per "Interruzione della connessione causata dal software". –

+0

Sì, sono su thread separati. Telefoni diversi Il dispositivo mittente invia i dati quasi istantaneamente. – shiraz

risposta

2

Sono stato in grado di risolvere questo problema inviando piccoli blocchi di dati verso l'uscita Bluetooth. Si è scoperto che 8 * 1024 era una buona dimensione del buffer, il che ha aiutato a inviare i dati senza interruzioni sul flusso, oltre a prevenire il danneggiamento dei dati a livello destinatario.

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

Ho riscontrato un problema con l'invio di un semplice file di immagine tramite bluetooth utilizzando un esempio di chat Bluetooth. In realtà, il mio requisito era inviare un file con qualsiasi bluetooth oevr. Per questo come posso impostare la dimensione del buffer, come ricevere piccoli blocchi di dati e combinarli dal lato del destinatario. Potresti per favore condividi il tuo codice? –

+0

puoi dare un'occhiata a questo http://stackoverflow.com/questions/16954082/send-text-file-using-bluetooth-sockets-in-android – neerajDorle

+0

Sto sviluppando una soluzione basata sul tuo approccio, ma Sono bloccato su outStream.write (mybytearray, 0, mybytearray.length); semplicemente non scrive i dati sul flusso di output.Nessun errore, il file viene creato con una dimensione di 0 byte e i registri si fermano subito dopo bis.read (mybytearray, 0, mybytearray.length). Qualche idea? –