Hallo zusammen,
ich möchte bei einer App für Android und iOS prüfen, ob der Bluetooth-Adapter (bzw. eigentlich Bluetooth
LE) aktiviert ist.
Bisher habe ich nur auf Android getestet, zu iOS bin ich noch nicht vorgedrungen.
Hier mein Problem auf Android:
Warum brauche ich die Prüfung?
Prüfe ich nicht selbst sondern versuche einfach bei deaktiviertem Bt-Adapter z.B. einen Scan zu starten, meldet sich zwar das Betriebssystem und fragt, ob ich Bt nun aktivieren möchte. Die App friert dabei jedoch ein und muss abgeschossen und neu gestartet werden.
Ich habe 2 Dinge bei Embarcadero gefunden, die beide dasselbe beschreiben:
https://community.embarcadero.com/an...-in-delphi-xe7
und
https://community.embarcadero.com/an...one-or-android
Sieht ja einfach aus, also umgesetzt:
Code:
function TFormX.BluetoothEnabled:boolean;
begin
//FUNKTIONIERT NICHT:
//prüfen, ob Bt aktiviert ist:
case BLEDev.GetCurrentAdapter.State of
TBluetoothAdapterState.Off: result:=false;
TBluetoothAdapterState.On: result:=true;
TBluetoothAdapterState.Discovering: result:=true;
end;
end;
Leider bekomme ich mit diesem Verfahren ein "Segmentation Fault(11)". Tolle "Lösung"... oder mache ich was falsch?
Ich habe soeben auch noch diese Variante probiert:
Code:
function TFormMiB2.BluetoothEnabled2:boolean;
var BT_Adapter: TBluetoothAdapter;
begin
//FUNKTIONIERT NICHT:
BT_Adapter := TBluetoothManager.Current.CurrentAdapter;
if BT_Adapter.State = TBluetoothAdapterState.Off then
result:=false
else
result:=true;
end;
Hier bekomme ich schon bei der Zuweisung "BT_Adapter:=..." albernerweise die Debugger-
Exception "Bluetooth-Gerät nicht gefunden: nicht verbunden oder ausgeschaltet". Immerhin, kein Absturz an dieser Stelle sondern eine nutzbare
Exception. Und während ich noch tippe, finde ich so schon selber eine funktionierende Lösung:
Code:
function TFormX.BluetoothEnabled:boolean;
var BT_Adapter: TBluetoothAdapter;
begin
result:=true;
try
BT_Adapter := TBluetoothManager.Current.CurrentAdapter;
except
on e:EBluetoothAdapterException do
begin
result:=false;
end;
on exc:
Exception do
begin
result:=false;
end;
end;
if result then
begin
case BT_Adapter.State of
TBluetoothAdapterState.Off: result:=false;
TBluetoothAdapterState.On: result:=true;
TBluetoothAdapterState.Discovering: result:=true;
end;
end;
end;
Diese Lösung funktioniert unter Android und Windows 10.
Dann fehlt jetzt nur noch eine Bestätigung dieser Lösung oder eine andere Lösung für iOS.
Ich werde hier die Ergebnisse ergänzen, wenn ich soweit bin. Ich weiß allerdings nicht, wann ich das testen werde. Es könnte etwas dauern.
Hat vielleicht schon jemand eine Lösung für iOS oder eine elegantere Lösung für Android/Windows?
Danke schon vorab!