Page 1 of 2 1 2 LastLast
Results 1 to 15 of 20

Thread: GSM Signaal sterkte (Android)

  1. #1

    GSM Signaal sterkte (Android)

    Ik zou graag de GSM Signaal sterkte weer kunnen geven in mijn App (Android, FMX), zoals klein weer wordt gegeven boven in het Android scherm.
    Ik heb deze code gevonden op deze site: https://stackoverflow.com/questions/...phi-firemonkey

    Daar hebben ze het over het LTE Signaal, maar is dat wel wat ik bedoel denken jullie ?

    Code:
    procedure TfrmAppMain.GetCellLevel: Integer;
    var
      obj: JObject;
      Cells: JList;
      i: Integer;
      Cell: JCellInfo;
      CellInfoLte: JCellInfoLte;
      CellInfoWcdma: JCellInfoWcdma;
      cname: String;
    begin
      Result := -1;
      obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
      if obj <> nil then
      begin
        TelephonyManager := TJTelephonyManager.Wrap(obj);
        Cells := TelephonyManager.getAllCellInfo;
        // iter := Cells.iterator;
        i := 0; 
        while (i < cells.size) do
        begin
          obj := Cells.get(i);
          Cell := TJCellInfo.Wrap(obj);
          if Cell.isRegistered then
          begin
            cname := JStringToString(Cell.getClass.getName);
            if cname = 'android.telephony.CellInfoLte' then
            begin
              CellInfoLte := TJCellInfoLte.Wrap(Cell);
              Result := CellInfoLte.getCellSignalStrength.getLevel; // 0..4
            end
            else if cname = 'android.telephony.CellInfoWcdma' then
            begin
              CellInfoWcdma := TJCellInfoWcdma.Wrap(Cell);
              Result := CellInfoWcdma.getCellSignalStrength.getLevel; // 0..4
            end;
          end;
          Inc(i);
        end;
      end;
    end;

  2. #2
    Quote Originally Posted by MMSoft View Post
    Daar hebben ze het over het LTE Signaal, maar is dat wel wat ik bedoel denken jullie ?
    Weer een redelijk lekker open vraag zeg.

    Wat als we nu zeggen "ja, dat denken we wel" ???
    Weet je dan genoeg?
    Werkt het?
    Krijg je een signaal sterkte met deze code?

    WANT IK NEEM AAN DAT JE DIT ZELF AL UITGETEST HEBT

    Ik heb het ook even aan ChatGPT voor je gevraagd.

    Dan kun je zien of de code ongeveer overeenkomt.
    (ChatGPT is niet altijd accuraat maar geeft je wel een punt om mee verder te gaan)


  3. #3
    Dit gaf een fout:

    var
    TelephonyManager: JTelephonyManger;

    Daar heb ik dit van gemaakt:
    var
    TelephonyManager: Androidapi.JNI.Telephony.JTelephonyManager;


    Helaas gaat het nog fout op deze regel:
    SignalStrength := TelephonyManager.getSignalStrength;

    Daar krijg ik de melding:
    [DCC Error] Unit1.pas(1669): E2003 Undeclared identifier: 'getSignalStrength'

    Ik heb hier helaas geen oplossing voor kunnen vinden

  4. #4
    Het was ook niet bedoeld als exacte code die je over kunt typen.
    Deze code kwam van ChatGPT en die schraapt overal kleine stukjes bij elkaar.
    Het geeft alleen een algemeen beeld van welke dingen je kunt gebruiken.

    Zo was jouw vraag... "maar is dat wel wat ik bedoel denken jullie ?"

    Ik zie in de code van ChatGPT de tekst getCellSignalStrength en JTelephonyManager staan.
    Die staat er bij jouw code ook in.

    Dus ChatGPT denkt dat het antwoord op jouw vraag "JA" is.

    Beantwoord dit jouw vraag?

  5. #5
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Quote Originally Posted by MMSoft View Post
    Dit gaf een fout:

    var
    TelephonyManager: JTelephonyManger;
    Hier vind je 'oplossing'
    https://developer.android.com/refere...SignalStrength

    Gr. Peter
    10.4.2, Delphi2010, of Lazarus 2.2.0

  6. #6
    Ik probeer van alles maar krijg alleen maar fout meldingen:

    Level := TelephonyManager.CellSignalStrength; //Geeft:
    [DCC Error] Unit1.pas(1673): E2003 Undeclared identifier: 'CellSignalStrength'

    Level := TelephonyManager.getCellSignalStrength; //Geeft:
    [DCC Error] Unit1.pas(1673): E2003 Undeclared identifier: 'getCellSignalStrength'


    Code:
    function GetSignalStrength: Integer;
    var
     //TelephonyManager:
     //TelephonyManager: JTelephonyManger;
     TelephonyManager: Androidapi.JNI.Telephony.JTelephonyManager;
     SignalStrength: JSignalStrength;
     Level: Integer;
    
    
    begin
     TelephonyManager := TJTelephonyManager.Wrap(
       SharedActivityContext.getSystemService(
         TJContext.JavaClass.TELEPHONY_SERVICE));
     //SignalStrength := TelephonyManager.CellSignalStrength; //   .getSignalStrength;
    
    // Level := SignalStrength.CellSignalStrength; //    getGsmSignalStrength;
    // Level := TelephonyManager.CellSignalStrength;
    // Level := TelephonyManager.CellSignalStrength.CellSignalStrength;
     Level := TelephonyManager.CellSignalStrength;
    
    // if Level = 99 then
    //  Result := -1
    // else
    //  Result := (2 * Level) - 113;
    end;
    Edit: Fout meldingen toegevoegd
    Last edited by MMSoft; 04-Apr-23 at 15:57.

  7. #7
    Leuk. Foutmeldingen. Succes

    Of moeten wij nog helpen?
    Dan kan het handig zijn die foutmeldingen ook te noemen en waar ze optreden

    O, en heb je nu de code van ChatGPT gepakt?
    Ik heb je al gezegd dat je dat niet moest doen (en waarom).

    Welke foutmeldingen geeft de originele code van de stack overflow pagina?

  8. #8
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Heb je 'm minstens met Api 30 gecompileerd ?

    Rem: getSignalStrength was just added in API 30.
    10.4.2, Delphi2010, of Lazarus 2.2.0

  9. #9
    Quote Originally Posted by MMSoft View Post
    Level := TelephonyManager.CellSignalStrength; //Geeft:
    [DCC Error] Unit1.pas(1673): E2003 Undeclared identifier: 'CellSignalStrength'

    Level := TelephonyManager.getCellSignalStrength; //Geeft:
    [DCC Error] Unit1.pas(1673): E2003 Undeclared identifier: 'getCellSignalStrength'
    Er staat ook nergens dat CellSignalStrength een functie is van TelephonyManager.
    In de stackoverflow oplossing is het een functie van JCellInfoLte.
    Dus logisch dat je foutmeldingen krijgt.

    (Zelfs ChatGPT gebruikt niet (get)CellSignalStrength van TelephonyManager. Maar ik heb je al gezegd dat die code alleen maar was om te kijken of je met XXXX.CellSignalLength in de goede richting zat en dat dat geen correcte code is.)

    Ik zie niet welke foutmeldingen de stackoverflow oplossning geeft.

    (en inderdaad... api versie is ook erg van belang.)

  10. #10
    Ik ben code aan het testen, maar dat testen is erg lastig omdat ik het vergelijk met de originele signaal weergaven op de telefoon (boven in het scherm).
    Maar ik kan deze zeer kleine signaal weergaven zeer moeilijk zien (vandaar dat ik deze dan ook groter weer wil geven).

  11. #11
    Ik kon er helaas niet uit, deze code heb ik nu:

    Code:
    function GetCellLevel(): Integer; //Het GSM Signaal sterkte ?
    var
      TelephonyManager: Androidapi.JNI.Telephony.JTelephonyManager;
      obj: JObject;
      Cells: JList;
      i: Integer;
      Cell: JCellInfo;
      CellInfoLte: JCellInfoLte;
      CellInfoWcdma: JCellInfoWcdma;
      cname: String;
    
    begin
      Result := -1; // Geen Bereik ?
      obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
    
      if obj <> nil then
      begin
        TelephonyManager := TJTelephonyManager.Wrap(obj);
        Cells := TelephonyManager.getAllCellInfo;
        // iter := Cells.iterator;
        i := 0;
    
        while (i < cells.size) do
         begin
    
          obj := Cells.get(i);
          Cell := TJCellInfo.Wrap(obj);
          if Cell.isRegistered then
    
          begin
            cname := JStringToString(Cell.getClass.getName);
            if cname = 'android.telephony.CellInfoLte' then
             begin
              //Deze moet ik hebben denk ik
              CellInfoLte := TJCellInfoLte.Wrap(Cell);
              Result := CellInfoLte.getCellSignalStrength.getLevel; // 0..4
              Form1.Label2.text := '1';
             end
            else if cname = 'android.telephony.CellInfoWcdma' then
             begin
              //Waar is dit voor (dit lijkt niets te doen) ?
              //CellInfoWcdma := TJCellInfoWcdma.Wrap(Cell);
              //Result := CellInfoWcdma.getCellSignalStrength.getLevel; // 0..4
              Form1.Label2.text := '2';
             end;
    
          end;
    
          Inc(i);
    
         end;
    
      end;
    
    end;
    Dit lijkt niet betrouwbaar te werken, want soms krijg ik -1 (Geen verbinding ?), terwijl er wel een slecht bereik is.

    De waarde 4 krijg ik zelden, ook al sta ik heel dicht bij een zendmast.

    En dan is er nog de vraag welke API versie ik heb, ik kan alleen de SDK versie vinden, dit is versie SDK 25.
    Dus waar en hoe kan ik de API versie vinden ?

  12. #12
    Quote Originally Posted by MMSoft View Post
    Dit lijkt niet betrouwbaar te werken, want soms krijg ik -1 (Geen verbinding ?), terwijl er wel een slecht bereik is.
    Je hebt naast LTE (4G) ook nog GSM (2G), CDMA en WCDMA (3G).

    Als LTE (4G) niet beschikbaar is (of te slecht) schakelt je telefoon over op een andere techniek.
    Bijvoorbeeld EDGE (herinner je je dat nog?).
    Dat moet je ook aan het icoontje kunnen zien rechtsboven bij het signaal.

    https://www.quora.com/What-is-GSM-CDMA-WCDMA-LTE

    Jij hebt die code voor CellInfoWcdma nu weggecomment.
    Maar als cname android.telephony.CellInfoWcdma bevat dan zul je die dus wel moeten gebruiken.

    Log dus (ipv alleen maar een 1 of 2'tje) ook de cname eens naar display en kijk of dat iets anders dan CellInfoLte is.

  13. #13
    Log dus (ipv alleen maar een 1 of 2'tje) ook de cname eens naar display en kijk of dat iets anders dan CellInfoLte is.
    Alvast deze 2 gevonden:
    Geen Sim kaart: android.telephony.CellInfoWcdma
    Wel Sim kaart: android.telephony.CellInfoLte

  14. #14
    Met die android.telephony.CellInfoWcdma is het natuurlijk logisch dat je -1 krijgt want daar heb je het uitlezen weggevinkt.

  15. #15
    Na dagen testen:

    Als er Geen Sim kaartje in de Telefoon zit:
    android.telephony.CellInfoWcdma (geeft vreemd genoeg soms de waarde 4)


    Als er wel een Sim kaartje in de Telefoon zit:
    android.telephony.CellInfoLte (Deze lijkt goed te werken)
    android.telephony.CellInfoGsm (Deze wordt uitgevoerd als er geen Verbinding is (Telefoon moet dan opnieuw opgestart worden), het vreemde is dan je dan wel (soms) de waarde 4 krijgt)

    Code:
    function GetCellLevel(): Integer; //Het GSM Signaal sterkte ?
    var
      TelephonyManager: Androidapi.JNI.Telephony.JTelephonyManager;
      obj: JObject;
      Cells: JList;
      i: Integer;
      Cell: JCellInfo;
      CellInfoLte: JCellInfoLte;
      CellInfoGsm: JCellInfoGsm;
      CellInfoWcdma: JCellInfoWcdma;
      cname: String;
    
    begin
      Result := -1; // Geen Bereik
      obj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
    
      if obj <> nil then
      begin
        TelephonyManager := TJTelephonyManager.Wrap(obj);
        Cells := TelephonyManager.getAllCellInfo;
        // iter := Cells.iterator;
        i := 0;
    
        while (i < cells.size) do
         begin
    
          obj := Cells.get(i);
          Cell := TJCellInfo.Wrap(obj);
          if Cell.isRegistered then
    
          begin
            cname := JStringToString(Cell.getClass.getName);
            Tijdelijk_Str := cname;
    
            Form1.Label10.text := cname;
    
            if cname = 'android.telephony.CellInfoLte' then
             begin
              //Deze code lijkt goed te werken
              CellInfoLte := TJCellInfoLte.Wrap(Cell);
              Result := CellInfoLte.getCellSignalStrength.getLevel; // 0..4
             end
            else if cname = 'android.telephony.CellInfoGsm' then
             begin
              //Deze wordt uitgevoerd als er geen Verbinding is (Telefoon moet dan opnieuw opgestart worden), het vreemde is dan je dan wel (soms) de waarde 4 krijgt
    
              CellInfoGsm := TJCellInfoGsm.Wrap(Cell);
              Result := CellInfoGsm.getCellSignalStrength.getLevel; // 0..4
             end
            else if cname = 'android.telephony.CellInfoWcdma' then
             begin
              //Dit wordt uitgevoerd als er geen Sim kaartje in de Telefoon zit !!
    
              CellInfoWcdma := TJCellInfoWcdma.Wrap(Cell);
              Result := CellInfoWcdma.getCellSignalStrength.getLevel; // 0..4
             end;
    
          end;
    
          Inc(i);
    
         end;
    
      end;
    
    end;
    Maar hoe nu verder ?
    Last edited by MMSoft; 16-Apr-23 at 19:20.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •