XE7识别蓝牙断开连接

时间:2015-02-26 09:10:32

标签: android delphi bluetooth delphi-xe7

在Android上使用Delphi XE7,我通过Bluetooth Classic SPP设备连接。

我有JBluetoothSocket

var
  Sock: JBluetoothSocket;
  uid: JUUID; // UUID for SPP traffic
  targetMAC: string; // remote MAC address of the selected
  remoteDevice: JBluetoothDevice;
  Adapter: JBluetoothAdapter; // Local BLUETOOTH adapter
begin
  Adapter := TJBluetoothAdapter.JavaClass.getDefaultAdapter;
  targetMAC := ....;
  remoteDevice := Adapter.getRemoteDevice(stringtojstring(targetMAC));
  uid := TJUUID.JavaClass.fromString(stringtojstring('00001101-0000-1000-8000-00805F9B34FB'));
  Sock := remoteDevice.createInsecureRfcommSocketToServiceRecord(uid);
end;

重新启动BlueTooth设备后,无法再读取JBluetoothSocket流,因为套接字失败。所以我想在连接失败后立即重新连接。

我试过了,但它不起作用:

if Sock.isConnected then
begin
  TryReconnect;
end;

我们还发现,手机CAT B15总是返回Sock.isConnected = False,即使已连接,因为这个功能似乎没有在他们的BT堆栈中实现......

我听说我可能需要接收广播ACL_DISCONNECTED,但我找不到解决方案如何在Firemonkey中完成。

1 个答案:

答案 0 :(得分:0)

解决方案:https://code.google.com/p/delphi-android-broadcast-receiver-component/

procedure TMeasurementForm.OnBroadcastReceive(Context: JContext; Intent: JIntent);
begin
  // TODO: Check which event it is? (ACL_DISCONNECTED)
  Close;
end;

var
   bcr: TBroadcastReceiver;-
begin
  bcr := TBroadcastReceiver.Create(Self);
  bcr.RegisterReceive;
  bcr.Add('android.bluetooth.device.action.ACL_DISCONNECTED'); // constant android.bluetooth.BluetoothDevice.ACTION_ACL_DISCONNECTED
  bcr.OnReceive := OnBroadcastReceive;
end;