在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中完成。
答案 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;