2010-03-10 3 views
0

Я разрабатываю простой клиент bluetooth j2me и имею проблемы с поиском устройства Bluetooth. Функция startInquiry ничего не найдено.j2me клиент bluetooth. Функция startInquiry ничего не найдено

Клиент: Nokia 5220 Сервер: мой компьютер с Bluetooth адаптером

Все Bluetooth устройства включена.

/* * Чтобы изменить этот шаблон, выберите «Инструменты» | Шаблоны * и откройте шаблон в редакторе. */

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) { 
      } 
} 

ответ

1

Не уверен, что точная проблема, но вы определенно не хотите делать это в startApp() методе вашего мидлета. Это метод жизненного цикла системы и должен быстро возвращаться, но сканирование устройств Bluetooth будет блокировать его в течение длительного времени. Ваш метод startApp() связывает ресурсы устройства, которые могут потребоваться для фактического сканирования!

Рефакторинг, поэтому сканирование вашего устройства выполняется в новом потоке, а затем посмотрите, что произойдет.

0

Вы говорите, что все устройства: на - но также проверьте, все ли устройства можно обнаружить.

Я сделал эту ошибку перед собой!

Поиск метода LocalDevice.setDiscoverable(), если вы хотите программно переключаться между режимами.

1

Возможно, вы неправильно поняли, как работает Bluetooth API. Только startInquiry метод запускает процесс обнаружения устройства и сразу же возвращает его, оставив обнаружение в фоновом режиме. Когда обнаружены устройства, вы получаете обратный вызов метода deviceDiscovered для каждого из них, и когда процесс обнаружения завершен, вы получаете обратный вызов метода inquiryCompleted. Поэтому вам нужно переместить доступ к элементу vecDevices и манипуляции с формой от startApp до inquiryCompleted, чтобы иметь возможность реально отображать обнаруженную информацию.

Смежные вопросы