jBluetooth: how to use lazarus / 43-Android ---------------------------------------------------------------------- svd71 · 2020-06-11 18:16 Hallo all. Can somebody explaine me how to work with a bluetooth-module like HM-10? An example named as " AppBluetoothClientSocketHC0506Terminal1" has compiled with errors and crashed after run on device. I built an test-example. A smartphone find a target device by name, but can't to connect with him and read/write a data from bt-module. Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i unit u_mainform; {$mode delphi} interface uses  {$IFDEF UNIX}{$IFDEF UseCThreads}  cthreads,  {$ENDIF}{$ENDIF}  Classes, SysUtils, AndroidWidget, Laz_And_Controls, bluetooth,  bluetoothclientsocket, togglebutton;  type   { TAndroidModule1 }   TAndroidModule1 = class(jForm)    jBluetooth1: jBluetooth;    jBluetoothClientSocket1: jBluetoothClientSocket;    jDialogProgress_BT_Discovery: jDialogProgress;    jTextView_BTDev: jTextView;    jTimer_Bluetooth_chk: jTimer;    jToggleButton1: jToggleButton;    procedure AndroidModule1CloseQuery(Sender: TObject; var CanClose: boolean);    procedure AndroidModule1JNIPrompt(Sender: TObject);    procedure AndroidModule1RequestPermissionResult(Sender: TObject;      requestCode: integer; manifestPermission: string;      grantResult: TManifestPermissionResult);    procedure jBluetooth1DeviceFound(Sender: TObject; deviceName: string;      deviceAddress: string);    procedure jBluetooth1Disabled(Sender: TObject);    procedure jBluetooth1DiscoveryFinished(Sender: TObject;    countFoundedDevices: integer; countPairedDevices: integer);    procedure jBluetooth1DiscoveryStarted(Sender: TObject);    procedure jBluetooth1Enabled(Sender: TObject);    procedure jBluetoothClientSocket1Connected(Sender: TObject;      deviceName: string; deviceAddress: string);    procedure jBluetoothClientSocket1Disconnected(Sender: TObject);    procedure jBluetoothClientSocket1IncomingData(Sender: TObject;      var dataContent: TDynArrayOfJByte; dataHeader: TDynArrayOfJByte);    procedure jTimer_Bluetooth_chkTimer(Sender: TObject);    procedure jToggleButton1Toggle(Sender: TObject; state: boolean);  private    {private declarations}  public    FIsDiscovering: boolean;    procedure ShowNewDevices;    procedure Discovery_BT;    procedure Disable_BT;    procedure ShowPairedDevices;    procedure BindDevice(const deviceName, deviceAddress: String);  end; var  AndroidModule1: TAndroidModule1;  test_send_msg_count: integer;  receive_msg_str: string;  jTimer_Bluetooth_chk_count: integer;  toast_bt_rx_en: boolean; implementation  {$R *.lfm}   { TAndroidModule1 } procedure TAndroidModule1.AndroidModule1JNIPrompt(Sender: TObject);var  BT_device: string;begin   if IsRuntimePermissionNeed() then   // that is, if target API >= 23  begin    ShowMessage('Requesting Runtime Permission....');    Self.RequestRuntimePermission(['android.permissio n.ACCESS_COARSE_LOCATION',                                   'android.permission.ACCESS_FINE_LOCATION'], 1110);   //handled by OnRequestPermissionResult  end;   jTextView_BTDev.Text:= '';  Self.SetScreenOrientationStyle(ssPortrait); //Portrait orientation only  toast_bt_rx_en := True; //Toast Bt RX enable by default  if (not jBluetooth1.IsEnable()) then  begin    jBluetooth1.Enabled();//    jTimer_Bluetooth_chk.Interval := 1000; // 15 sec wait to turn on Bluetooth module//    jTimer_Bluetooth_chk.Enabled := True;//    jTimer_Bluetooth_chk_count := 0;  end  else  begin    //Here when BT already enabled on startup app    Discovery_BT;  end;  //  ShowPairedDevices;end; procedure TAndroidModule1.AndroidModule1CloseQuery(Sender: TObject;  var CanClose: boolean);begin  if (jBluetoothClientSocket1.IsConnected()) then    jBluetoothClientSocket1.Disconnect();  CanClose := True;end; procedure TAndroidModule1.AndroidModule1RequestPermissionResult(  Sender: TObject; requestCode: integer; manifestPermission: string;  grantResult: TManifestPermissionResult);begin  case requestCode of  1110:begin         if grantResult = PERMISSION_GRANTED  then         begin            //if manifestPermission = 'android.permission.ACCESS_COARSE_LOCATION' then ShowMessage('"'+manifestPermission+'"  granted!');            //if manifestPermission = 'android.permission.ACCESS_FINE_LOCATION' then ShowMessage('"'+manifestPermission+'"  granted!')         end        else//PERMISSION_DENIED        begin            ShowMessage('Sorry... "['+manifestPermission+']" not granted... ' );        end;     end;  end;end; procedure TAndroidModule1.jBluetooth1DeviceFound(Sender: TObject;  deviceName: string; deviceAddress: string);begin  if (deviceName = 'CARDI0') then  begin    //ShowMessage('deviceName: ' +deviceName +' : deviceAddress: '+deviceAddress);    //jListView1.Add(deviceName + '|' + deviceAddress);    jTextView_BTDev.Text := deviceName + ':' + deviceAddress;    BindDevice(deviceName, deviceAddress);  end;end; procedure TAndroidModule1.jBluetooth1Disabled(Sender: TObject);begin  jTextView_BTDev.Text := '';  jToggleButton1.State:= tsOn;  ShowMessage('Bluetooth Off');end; procedure TAndroidModule1.jBluetooth1DiscoveryFinished(Sender: TObject;  countFoundedDevices: integer; countPairedDevices: integer);begin  jDialogProgress_BT_Discovery.Stop;  FIsDiscovering := False;  //ShowNewDevices();end; procedure TAndroidModule1.jBluetooth1DiscoveryStarted(Sender: TObject);begin  FIsDiscovering := True;  ShowMessage('Starting Discovering News Devices..');end; procedure TAndroidModule1.jBluetooth1Enabled(Sender: TObject);begin  if (jBluetooth1.IsEnable()) then  begin    ShowMessage('Bluetooth On');    jTimer_Bluetooth_chk.Enabled := False;  end;end; procedure TAndroidModule1.jBluetoothClientSocket1Connected(Sender: TObject;  deviceName: string; deviceAddress: string);begin   ShowMessage('connected');   jToggleButton1.State:= tsOff;end; procedure TAndroidModule1.jBluetoothClientSocket1Disconnected(Sender: TObject);begin  ShowMessage('Disconnected');  jToggleButton1.State:= tsOn;end; procedure TAndroidModule1.jBluetoothClientSocket1IncomingData(Sender: TObject;  var dataContent: TDynArrayOfJByte; dataHeader: TDynArrayOfJByte);begin  ShowMessage(jBluetoothClientSocket1.JByteArrayToString(dataContent));  jTextView_BTDev.Text:= jBluetoothClientSocket1.JByteArrayToString(data Content);end;  procedure TAndroidModule1.jTimer_Bluetooth_chkTimer(Sender: TObject);begin  //Check after 30 sec Android module Bluetooth is enabled, if not close app  Inc(jTimer_Bluetooth_chk_count); // + 1 sec  if (jTimer_Bluetooth_chk_count > 30) then  begin    jTimer_Bluetooth_chk.Enabled := False;    //30 sec elapsed, check BT is enabled    if (not jBluetooth1.IsEnable()) then    begin      AndroidModule1.Close;    end    else    begin      ShowMessage('Bluetooth On');      Discovery_BT;    end;  end  else  begin    //30 sec not elapsed, check BT is enabled    if (jBluetooth1.IsEnable()) then    begin      jTimer_Bluetooth_chk.Enabled := False;      ShowMessage('Bluetooth On');      Discovery_BT;    end;  end;end; procedure TAndroidModule1.jToggleButton1Toggle(Sender: TObject; state: boolean);begin  if not state then    Discovery_BT  else    Disable_BT;end; procedure TAndroidModule1.ShowNewDevices;var  listArray: TDynArrayOfString;  i, size: integer;begin  listArray := jBluetooth1.GetFoundedDevices();  if listArray <> nil then  begin    size := Length(listArray);    if size = 0 then      ShowMessage('News Devices Not Found ... [0]')    else    begin      if (listArray[0].Contains('null')) then      begin        ShowMessage('News Devices Not Found ... empty');      end      else    begin        //jListView1.Clear;        //jListView_BT_connect.Add('      Select a Bluetooth Server:');//        jTextView_BT_list.Text := 'Bluetooth Device: [Discovered]';        for i := 0 to size - 1 do      begin          //ShowMessage(listArray[i]);          //jListView1.Add(listArray[i]);        end;        SetLength(listArray, 0);      end;    end;  end  else    ShowMessage('News Devices Not Found ... [nil]');end; procedure TAndroidModule1.Discovery_BT;begin   if not IsRuntimePermissionGranted ('android.permission.ACCESS_COARSE_LOCATION') then  begin    ShowMessage('Sorry... "android.permission.ACCESS_COARSE_LOCATION');  Exit;  end;   if not IsRuntimePermissionGranted('android.permission.ACCESS_FINE_LOCATION') then  begin    ShowMessage('Sorry... "android.permission.ACCESS_FINE_LOCATION');    Exit;  end;   if not jBluetooth1.IsEnable() then    jBluetooth1.Enabled();  if (jBluetooth1.IsEnable()) then  begin    //Discovery BT devices//    jListView_BT_connect.Clear;    jBluetooth1.Discovery();    //handled by: OnDiscoveryStarted, OnDeviceFound and OnDiscoveryFinished//    jDialogProgress_BT_Discovery.Show();  end  else    jToggleButton1.State := tsOn;end; procedure TAndroidModule1.Disable_BT;begin  jBluetooth1.Disable();  jTextView_BTDev.Text := '';end; procedure TAndroidModule1.ShowPairedDevices;var  listArray: TDynArrayOfString;  i, size: integer;begin  listArray := jBluetooth1.GetReachablePairedDevices();  if listArray <> nil then  begin    size := Length(listArray);    if size = 0 then      ShowMessage('Paired Devices Not Found ... [0]')    else    begin      if (listArray[0].Contains('null')) then      begin        ShowMessage('Paired Devices Not Found ... empty');      end      else      begin        //jListView1.Clear;        //jListView_BT_connect.Add('      [Paired] Select a Bluetooth Server'); //       jTextView_BT_list.Text := 'Bluetooth Device: [Paired]';        for i := 0 to size - 1 do        begin          //ShowMessage(listArray[i]);          //jListView1.Add(listArray[i]);        end;        SetLength(listArray, 0); //free ...      end;    end;  end  else    ShowMessage('Paired Devices Not Found ... [nil]');end; procedure TAndroidModule1.BindDevice(const deviceName, deviceAddress: String);begin  if Pos('null', deviceAddress) <= 0 then  begin    if  jBluetooth1.IsReachablePairedDevice(deviceAddress) then  begin      jBluetoothClientSocket1.SetDevice(        jBluetooth1.GetReachablePairedDeviceByAddress(deviceAddress));      //well known SPP UUID      jBluetoothClientSocket1.SetUUID('00001101- 0000-1000-8000-00805F9B34FB');      //default      jBluetoothClientSocket1.Connect();     end    else    begin      ShowMessage('Try to pair device...');      jBluetooth1.PairDeviceByAddress(deviceAddress);      //ShowMessage('Not ReachablePairedDevice...');    end;  end; end; end   Thank you for any advise.