2010-03-10 10 views
0

Je développe un simple client bluetooth j2me et ai un problème avec la recherche de périphériques bluetooth. Fonction startInquiry Rien trouvé.j2me client bluetooth. Fonction startInquiry Rien trouvé

Client: nokia 5220 Serveur: mon pc avec adaptateur Bluetooth

Tous les périphériques Bluetooth est activée.

/* * Pour modifier ce modèle, choisissez Outils | Modèles * et ouvrez le modèle dans l'éditeur. */

import javax.microedition.midlet.*; 
import javax.bluetooth.*; 
import java.util.Vector; 
import javax.microedition.lcdui.*; 

/** 
* @author Администратор 
*/ 
public class Midlet extends MIDlet implements DiscoveryListener 
{ 
    private static Vector vecDevices=new Vector(); 
    private static String connectionURL=null; 
    private LocalDevice localDevice; 
    private DiscoveryAgent agent; 
    private RemoteDevice remoteDevice; 
    private RemoteDevice[] devList; 
    private Display display; 
    private Form form; 

    public void startApp() { 
     display = Display.getDisplay(this); 
     form = new Form("Client"); 
     try { 
      localDevice = LocalDevice.getLocalDevice(); 
     } catch(BluetoothStateException e) { 
      e.printStackTrace(); 
     } 

     form.append("Address: "+localDevice.getBluetoothAddress()+"\n\n"); 
     form.append("Name: "+localDevice.getFriendlyName()+"\n\n"); 

     try { 
      agent = localDevice.getLocalDevice().getDiscoveryAgent(); 

      form.append("Starting device inquiry... \n\n"); 

      boolean si = agent.startInquiry(DiscoveryAgent.GIAC, this); 
      if (si) { 
       form.append("true"); 
      } else { 
       form.append("false"); 
      } 
     } catch(BluetoothStateException e) { 
     } 

     int deviceCount = vecDevices.size(); 
     if(deviceCount <= 0){ 
      form.append("No Devices Found ."); 
     } 
     else{ 
      //print bluetooth device addresses and names in the format [ No. address (name) ] 
      form.append("Bluetooth Devices: "); 
      for (int i = 0; i < deviceCount; i++) { 
       remoteDevice=(RemoteDevice)vecDevices.elementAt(i); 
       form.append(remoteDevice.getBluetoothAddress()); 
      } 
     } 

      display.setCurrent(form); 
    } 

    public void pauseApp() { 
    } 

    public void destroyApp(boolean unconditional) { 
    } 

     public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { 
       //add the device to the vector 
       if(!vecDevices.contains(btDevice)){ 
        vecDevices.addElement(btDevice); 
       } 
     } 
     public void inquiryCompleted(int discType) 
     { 
     } 


      //implement this method since services are not being discovered 
      public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { 
       if(servRecord!=null && servRecord.length>0){ 
        connectionURL=servRecord[0].getConnectionURL(0,false); 
       } 
      } 
      //implement this method since services are not being discovered 
      public void serviceSearchCompleted(int transID, int respCode) { 
      } 
} 

Répondre

1

Je ne sais pas quel est le problème exact est, mais vous ne voulez certainement pas faire cela dans la méthode startApp() de votre midlet. Il s'agit d'une méthode de cycle de vie du système, qui devrait revenir rapidement, mais la recherche de périphériques bluetooth le bloquera pendant longtemps. Votre méthode startApp() est en train d'attacher les ressources de l'appareil dont il pourrait avoir besoin pour faire la numérisation réelle! Refaire le refactoring pour que l'analyse de votre périphérique se fasse dans un nouveau thread, puis voir ce qui se passe.

0

Vous dites tous les périphériques sont sur - mais vérifiez également si tous les périphériques sont découvrable.

J'ai fait cette erreur avant moi!

Recherchez la méthode LocalDevice.setDiscoverable() si vous souhaitez basculer entre les modes par programme.

1

Vous semblez avoir mal compris le fonctionnement de l'API Bluetooth. La méthode startInquiry seulement démarre le processus de découverte de périphérique et revient immédiatement après, laissant la découverte s'exécuter en arrière-plan. Lorsque des périphériques sont détectés, vous recevez un rappel de la méthode deviceDiscovered pour chacun d'entre eux et lorsque le processus de détection est terminé, vous recevez un rappel de la méthode inquiryCompleted. Vous devez donc déplacer l'accès du membre vecDevices et la manipulation de formulaire de startApp à inquiryCompleted pour pouvoir afficher réellement les informations découvertes.