Einzelnen Beitrag anzeigen

knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#1

Prüfen, ob Bluetooth aktiviert ist

  Alt 29. Jun 2018, 11:28
Hallo zusammen,

ich möchte bei einer App für Android und iOS prüfen, ob der Bluetooth-Adapter (bzw. eigentlich BluetoothLE) 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!
Wolfgang
  Mit Zitat antworten Zitat