Пишу мидлет, который должен соединяться с таким же мидлетом на другом телефоне. Вот код:
| Код | package numexchange;
import java.io.IOException; import java.util.Vector; import javax.bluetooth.BluetoothStateException; import javax.bluetooth.DeviceClass; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.DiscoveryListener; import javax.bluetooth.LocalDevice; import javax.bluetooth.RemoteDevice; import javax.bluetooth.ServiceRecord; import javax.bluetooth.UUID; import javax.microedition.io.Connector; import javax.microedition.io.StreamConnection; import javax.microedition.io.StreamConnectionNotifier; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.List; import javax.microedition.lcdui.TextBox; import javax.microedition.lcdui.TextField; import javax.microedition.midlet.*;
public class NumExchangeMidlet extends MIDlet implements CommandListener, DiscoveryListener {
private NumCanvas canvas; private static final Command exit = new Command("Exit", Command.EXIT, 0); private final Command host = new Command("Host", Command.ITEM, 0); private final Command join = new Command("Join", Command.ITEM, 0); private final Command connect = new Command("Connect", Command.ITEM, 0); private List deviceList = null; private static final String uuidString = "00112233445566778899AABBCCDDEEFF"; private static NumExchangeMidlet midlet; private ServiceRecord record = null; private boolean deviceSearchEnded = false; private boolean serviceSearchEnded = false; private Vector devices = new Vector(); private final Object lock = new Object(); private String connectionURL = null;
public void startApp() { midlet = this; canvas = new NumCanvas(true); Display.getDisplay(this).setCurrent(canvas); canvas.addCommand(host); canvas.addCommand(join); canvas.addCommand(exit); canvas.setCommandListener(this); canvas.start(); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable d) { if (c == exit) { canvas.stop(); destroyApp(true); notifyDestroyed(); }
if (c == host) { try { Thread t = new Thread(new Runnable() {
private UUID uuid = new UUID(uuidString, false); private LocalDevice ldev = LocalDevice.getLocalDevice();
public void run() { StreamConnection conn = null; try { ldev.setDiscoverable(DiscoveryAgent.GIAC); StreamConnectionNotifier service = (StreamConnectionNotifier) Connector.open("btspp://localhost:" + uuid.toString() + ";name=NumExchange;authorize=false;authenticate=false;encrypt=false"); conn = service.acceptAndOpen(); } catch (IOException ex) { NumExchangeMidlet.showErrMessage(ex); } canvas.setConnection(conn); canvas.start(); canvas.removeCommand(host); canvas.removeCommand(join); } }); t.setPriority(Thread.NORM_PRIORITY); t.start(); } catch (Exception ex) { NumExchangeMidlet.showErrMessage(ex); } }
if (c == join) { try { deviceList = new List("Devices", List.EXCLUSIVE); LocalDevice ldev = LocalDevice.getLocalDevice(); DiscoveryAgent dAgent = ldev.getDiscoveryAgent(); dAgent.startInquiry(DiscoveryAgent.GIAC, this);
synchronized (lock) { try { lock.wait(); } catch (InterruptedException ex) { showErrMessage(ex); } }
if (devices.isEmpty()) { showErrMessage(new Exception("No devices found")); } else { for (int i = 0; i < devices.size(); i++) { try { deviceList.append(((RemoteDevice) devices.elementAt(i)).getFriendlyName(true), null); } catch (IOException ex) { showErrMessage(ex); } } deviceList.addCommand(exit); deviceList.addCommand(connect); deviceList.setCommandListener(this); Display.getDisplay(this).setCurrent(deviceList); } } catch (BluetoothStateException ex) { showErrMessage(ex); } }
if (c == connect) { try { RemoteDevice rdev = (RemoteDevice) devices.elementAt(deviceList.getSelectedIndex()); LocalDevice ldev = LocalDevice.getLocalDevice(); DiscoveryAgent dAgent = ldev.getDiscoveryAgent(); UUID[] uuidSet = {new UUID(0x1101), new UUID(uuidString, false)}; dAgent.searchServices(null, uuidSet, rdev, this); Thread t = new Thread(new Runnable() {
public void run() { synchronized (lock) { try { lock.wait(); } catch (InterruptedException ex) { showErrMessage(ex); } }
if (connectionURL == null) { showErrMessage(new Exception("No service found")); } else { try { StreamConnection conn = (StreamConnection) Connector.open(connectionURL); canvas.setConnection(conn); Display.getDisplay(midlet).setCurrent(canvas); canvas.start(); } catch (IOException ex) { showErrMessage(ex); } } } }); t.setPriority(Thread.NORM_PRIORITY); t.start(); } catch (BluetoothStateException ex) { showErrMessage(ex); } } }
static void showErrMessage(Exception ex) { TextBox errMsg = new TextBox("Exception", ex.toString(), 1024, TextField.ANY); errMsg.addCommand(exit); errMsg.setCommandListener(midlet); Display.getDisplay(midlet).setCurrent(errMsg); }
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { devices.addElement(btDevice); }
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { if (servRecord != null && servRecord.length > 0) { connectionURL = servRecord[0].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); } }
public void serviceSearchCompleted(int transID, int respCode) { if (respCode == DiscoveryListener.SERVICE_SEARCH_DEVICE_NOT_REACHABLE) { showErrMessage(new Exception("DEVICE_NOT_REACHABLE")); } else if(respCode == DiscoveryListener.SERVICE_SEARCH_ERROR){ showErrMessage(new Exception("ERROR")); } else if(respCode == DiscoveryListener.SERVICE_SEARCH_NO_RECORDS){ showErrMessage(new Exception("NO_RECORDS")); } else if(respCode == DiscoveryListener.SERVICE_SEARCH_TERMINATED){ showErrMessage(new Exception("TERMINATED")); } synchronized (lock) { lock.notify(); } }
public void inquiryCompleted(int discType) { synchronized (lock) { lock.notify(); } } }
|
Устройства находит, после чего я выбираю одно из них и в нем ищется сервис. По окончании поиска сервисов получаю в методе serviceSearchCompleted статус SERVICE_SEARCH_NO_RECORDS. Проблема появляется только на реальных устройствах. В WTK эмуляторе все работает. |