2010-09-02 5 views
0

J'essaie de refaire une application Java dans une application Android, mais je ne peux pas le faire fonctionner. L'application est destinée à parler à un appareil qui utilise OBEX Push. Le périphérique ne peut pas prendre de connexions entrantes et il n'a pas d'interface utilisateur mais quelques voyants.Android RFComm avec OBEX Push ne fonctionne pas

L'extrait de code java je suis en train de refaire suit:

LocalDevice local; 
local = LocalDevice.getLocalDevice(); 
local.setDiscoverable(DiscoveryAgent.LIAC); 
String sConnectionURL = "btspp://localhost:" + myUUID + ";name=" + obexName; 
this.server = (StreamConnectionNotifier) Connector.open(sConnectionURL); 

Je ne suis pas expert en java, mais pour autant que je sache, cet extrait devrait enregistrer un service de PSP avec le nom obexName et commencer à écouter les connexions entrantes via l'UUID myUUID. Cela fonctionne comme prévu. Lorsque le périphérique est associé au téléphone exécutant la midlet Java, il définit un bit à envoyer à un SPP avec l'UUID sur le téléphone ou n'envoie pas du tout. S'il ne trouve aucun SPP avec l'UUID pendant l'association, il essayera de se connecter au téléphone en utilisant l'OBEX normal à la place.

C'est la technique que je ne peux pas faire fonctionner sur un téléphone Android, ni un HTC Hero, ni un HTC Desire, les deux avec la version 2.1-update1. Peu importe comment j'essaie, le téléphone se connecte uniquement au téléphone, et non à l'application comme souhaité.

J'ai créé une classe tout comme l'exemple sur developer.android.com:

private class AcceptThread extends Thread 
{ 
    private final BluetoothServerSocket __serverSocket; 

    public AcceptThread() 
    { 
     BluetoothServerSocket tmpSocket = null; 

     trace("Creating AcceptThread"); 
     try 
     { 
      trace("Starting to listen"); 
      tmpSocket = _bluetoothAdapter.listenUsingRfcommWithServiceRecord(obexName, myUUID); 
      trace("Listening successful"); 
     } 
     catch (Exception e) 
     { 
      trace("Listening NOT successful"); 
      // TODO: handle exception 
     } 
     __serverSocket = tmpSocket; 
     trace("AcceptThread created"); 
    } 

    public void run() 
    { 
     BluetoothSocket socket = null; 
     trace("AcceptThread started"); 
     while(true) 
     { 
      try 
      { 
       trace("Waiting for socket acceptance"); 
       socket = __serverSocket.accept(); 
       trace("Socket accepted"); 
      } 
      catch (Exception e) 
      { 
       trace("Error when accepting socket: " + e.getLocalizedMessage()); 
       break; 
       // TODO: handle exception 
      } 
      if (socket != null) 
      { 
       synchronized (BTTransfer.this) 
       { 
        trace("Socket exists"); 
        try 
        { 
         __serverSocket.close(); 
         trace("Socket successfully closed"); 
        } 
        catch (Exception e) {} 
        break; 
       } 
      } 
      trace("Socket does not exist"); 
     } 
    } 

    public void cancel() 
    { 
     try 
     { 
      __serverSocket.close(); 
     } 
     catch (Exception e) {} 
     trace("AcceptThread cancelled and Socket successfully closed"); 
    } 
} 

Commentaires à propos du code:
La fonction de trace est un texte d'alimentation fonction synchronisée avec l'objet gestionnaire, donnant l'interface utilisateur information.
L'application ne fait sciemment rien d'autre que de fermer la connexion après une connexion réussie.
L'application atteint "Waiting for socket acceptance" mais jamais la trace après cela.

J'ai une application PC .NET qui peut se déguiser en périphérique, et en utilisant un UUID correct, cela fonctionne parfaitement, mais le PC est déjà couplé au téléphone et n'a pas le bit disant qu'il devrait être envoyé OBEX normal s'il ne peut pas trouver celui spécifié.

Je travaille avec cela depuis plusieurs jours et je n'arrive pas à trouver une solution. Est-ce que quelqu'un a des idées?

Merci à l'avance,
/Trygg


Avec le deuxième message que je veux dire ce qui suit:

Lorsque l'appareil en contact avec le téléphone, il y a une notification dans le menu déroulant indiquant un dispositif est en contact. Quelques secondes plus tard (en fonction de la taille du fichier), le fichier est transféré et une deuxième notification indique que le fichier est transmis. C'est le deuxième "message".

Depuis que j'écoute la déconnexion de l'appareil, et le client alors que mon programme sait déjà que le fichier est transmis, cette seconde notification est totalement inutile. Pourtant, il apparaîtra à chaque fois que l'appareil envoie des fichiers au téléphone. Dans nos tests sur Legend et Hero, nous ne parvenons jamais à la deuxième notification, cependant. C'est là que ces téléphones échouent. La première notification vient, puis rien, et l'appareil renvoie une erreur après quelques secondes.J'espère que cela aidera à clarifier ce que je voulais dire.

/Trygg


Je n'ai pas ce travail, mais fait une sorte de solution de contournement. Je registerad un BroadcastReceiver sur l'événement BluetoothDevice.ACTION_ACL_DISCONNECTED, puis vérifié pour quel périphérique a été déconnecté. Si c'était "le mien" j'ai cherché les fichiers dans la boîte de réception bluetooth.

J'ai reçu un message du fabricant de l'appareil disant que cela ne fonctionnera pas encore, mais ils travaillent sur un nouveau firmware. C'est pourquoi je n'ai pas été actif ici ni travaillé pour une meilleure solution.

+0

J'ai eu un succès moyen avec ceci: http://stackoverflow.com/a/14135187/530513 –

Répondre

0

Juste pour être sûr, avez-vous mis les bonnes autorisations dans le manifeste Android?

+0

Oui, je l'ai fait, ou du moins je le pense. Je me dis que si ça fonctionne avec le PC, ça devrait être correct? –

Questions connexes