2011-04-24 5 views
3

J'ai mis en place une connexion bluetooth en utilisant le code Google Bluetooth Chat maintenant classique. Cependant, j'ai une question que je n'arrive pas à comprendre.Comment détecter EOF sur le transfert de fichiers Bluetooth Android?

La lecture du flux d'entrée ressemble à ceci:

public void run() { 
    byte[] buffer = new byte[1024]; // buffer store for the stream 
    int bytes; // bytes returned from read() 

    // Keep listening to the InputStream until an exception occurs 
    while (true) { 
     try { 
      // Read from the InputStream 
      bytes = mmInStream.read(buffer); 
      // Send the obtained bytes to the UI Activity 
      mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer) 
        .sendToTarget(); 
     } catch (IOException e) { 
      break; 
     } 
    } 
} 

Maintenant, c'est très bien si je ne faisais que l'impression des personnages que je recevais comme dans l'exemple d'origine. Cependant, supposons que je veuille transférer un fichier image. Je ne connais pas la taille du fichier, donc je ne peux pas compter les octets reçus ou quelque chose comme ça. Dans mes tests, il ne semble pas que je reçoive un "-1" du flux d'entrée, ce qui semble être la "norme" pour la lecture des flux d'entrée. Alors, comment puis-je savoir que j'ai atteint la fin du fichier qui a été envoyé?

Nous vous remercions de votre aide et de votre temps.

Répondre

2

Il semble que les flux d'entrée bluetooth Android ne reviennent jamais -1.

Je suppose que la configuration d'un protocole simple en envoyant la taille du fichier en premier lieu et les signaux EOF enfin aidera.

+0

Je pensais que cela pourrait être le cas, mais je voulais voir s'il y avait un moyen plus simple que je méconnais. Mais vous avez confirmé ce que je dois faire ... Merci! –

1

Essayez

while ((bytes = mmInStream.read(buffer) != -1) 

et voir si cela aide.

2

Non, ce n'est pas le cas. Android envoie -1 seulement quand le Socket est fermé autant que je sache. Donc, une solution de contournement pourrait être de faire une reconnexion, mais j'essayais cela depuis des heures et je ne l'ai pas fait fonctionner, car je ne comprends pas ce code "spécial" ici (copié depuis un Stackoverflow Thread):

 BluetoothSocket tmp = null; 
    Log.d(TAG, "New Connection initialized"); 
    Method m; 
    try { 
     m = device.getClass().getMethod("createRfcommSocket", 
       new Class[] { int.class }); 
     tmp = (BluetoothSocket) m.invoke(device, 1); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    mmSocket = tmp; 

Ce socket fonctionne uniquement lorsque mon application est démarrée pour le premier transfert de fichiers. Si je veux "Reconnecter" avec un objet instancié complètement nouveau (et un nouveau Socket créé avec ce code), le programme se fige sur la méthode de blocage mmSocket.connect(). Il semble que la méthode n'arrive jamais à une fin. Cela me rend dingue ...

1

Essayez ceci:

 public void run() { 
     byte[] buffer; 
     ArrayList<Integer> arr_byte = new ArrayList<Integer>(); 
     while (true) { 
      try { 
       int data = mmInStream.read(); 
       if(mmInStream.available()>0) { 
        arr_byte.add(data); 
       } else { 
        arr_byte.add(data); 
        buffer = new byte[arr_byte.size()]; 
        for(int i = 0 ; i < arr_byte.size() ; i++) { 
         buffer[i] = arr_byte.get(i).byteValue(); 
        } 
        Log.e("INPUT",new String(buffer)); 
        mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer) 
          .sendToTarget(); 
        arr_byte = new ArrayList<Integer>(); 
       } 
      } catch (IOException e) { 
       break; 
      } 
     } 
    } 
Questions connexes