【问题标题】:XE7 Recognize Bluetooth DisconnectionXE7 识别蓝牙断线
【发布时间】:2015-02-26 09:10:31
【问题描述】:

在 Android 上使用 Delphi XE7,我通过蓝牙经典 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;

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

我尝试了以下方法,但它不起作用:

if Sock.isConnected then
begin
  TryReconnect;
end;

我们还发现,电话 CAT B15 始终返回 Sock.isConnected = False,即使已连接,因为此功能似乎没有在他们的 BT 堆栈中实现...

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

【问题讨论】:

    标签: android delphi bluetooth delphi-xe7


    【解决方案1】:

    解决方案: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;
    

    【讨论】:

      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多