Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschaltet (https://www.delphipraxis.net/204914-android-permissions-mit-bluetooth-le-und-location-werden-nicht-direkt-freigeschaltet.html)

Rollo62 13. Jul 2020 17:01

Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschaltet
 
Hallo zusammen,

ich habe einen Crosspost in derDP-EN hier gemacht, und wollte auch hier mal nachfragen ob das ein bekanntes Problem ist, oder ob das nur bei mir auftritt.

Weil man dort so schön Bilder einfüge kann, verlinke ich mal auf den Eintrag hier.

Das ist im Wesentlichen der Ablauf, und das Problem ist dass das Setzen der Location Berechntigung nicht mehr korrekt funktioniert.
M;an muss erst extern, im Android Dialog zu der App die Berechtigung ändern
(!! ja, es steht dort schon richtig, muss aber einmal hin- und hergeändert werden).
Erst danach wird BLE für den Zugriff aktiviert.

Ich habe ein paar Demo-Apps hochgeladen, hier der Link zur letzten Version.
In den Test-Versionen 1-4 habe ich ein bischen mit Permisisons, und sogar der neuen ALLOW_BACKGROUND_PERMISSION herumgespielt, obwohl die App gar keinen Background nutzt.

Im Ergebnis bleibt es bei mir gleich: Ich muss extern im Android App-Setup einmal die Berechtigung auf ALWAYS ändern, sonst bekomme ich keinen Scan.

Ich frage mich ob das auch bei Euch auch so passiert, und was die Ursache dafür sein könnte.
Könnte vieleicht jemand die Test-App ausprobieren, ob sie Scans zurückliefert ?
Denn vor Android 10 hat es eigentlich immer funktioniert, was ist jetzt anders ?
Für Anregungen/Vorschläge/Verbesserungen bin ich sehr dankbar.

philipp.hofmann 14. Jul 2020 10:34

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Hi Rollo,

leider konnte ich dein Projekt nicht bei mir starten, es bleibt beim Linken stehen.
Ich habe mein Projekt gegen Android 10 (von Delphi 10.3.3) aus getestet und dort geht noch alles mit Bluetooth.
Einziger Unterschied, ich frage nur ACCESS_COARSE_LOCATION ab, BLUETOOTH und BLUETOOTH_ADMIN habe ich nur in den Settings aktiviert.

Grüße, Philipp

Rollo62 14. Jul 2020 13:53

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Hallo Phillip, danke fürs Testen.
Warum hängt es beim Linken, ist ein Minimalbeispiel, nichts Besonderes drin :shock:
Das ist bei mir mit Rx10.4 Patch1 kompiliert.

Womöglich muss ConnectionProfile, SDKManager, ... angepasst werden, oder so.


Ich habe noch Tests gemacht, siehe hier im Link
https://en.delphipraxis.net/applicat...nt.php?id=2540


Test5 = mit ALLOW_BACKGROUND_PERMISSION in Manifest
Test6 = ohne ALLOW_BACKGROUND_PERMISSION in Manifest

Macht auch keinen Unterschied, ich muss IMMER erst extern EINMAL nach Installation die Permission Hin- und Herändern,
bevor ich Ergebnisse vom Bluetooth scan bekomme.
Danach geht es dann.
Mein Verdacht war der neue ALLOW_BACKGROUND_ Modus, ist es aber wohl nicht.

Das liegt aber auch nicht nur bei mir am Telefon,
denn ich sehe das Verhalten gleich auf mehreren Geräten.

Rollo62 14. Jul 2020 14:07

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1469515)
Android 10 (von Delphi 10.3.3)

Das ist ein interessanter Hinweis, habe bisher nur mit Rx10.4 probiert,
auch wegen der kommenden Android 29 Anforderung.
Rx10.4 kann das, Rx10.3.3 aus dem Stand erstmal nicht.

Ausserdem brauche ich Bluetooth im Background-Modus, das kommt erschwerend hinzu.

Aber es macht vielleicht Sinn Rx10.3.3 zu testen, und dann dort auf API-29 umzusteigen.
Hast Du vor auf 10.3.3 zu bleiben, gibt es da vielleicht irgendwelche Fallstricke für API-29
die man beachten müsste wegen Bluetooth, Location, etc. ?

Ich habe Rx10.4 unkritisch gesehen, auch weil alle API's von Adnroid die ich brauche unverändert geblieben sind, es sollte sich also wie Rx10.3.3 Verhalten.

philipp.hofmann 14. Jul 2020 15:26

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Ich bin bisher immer noch auf 10.3.3, weil es MadExcept offiziell noch nicht für 10.4 gibt.
Sobald sich dies ändert, werde ich auch umsteigen und dort testen. Ist aber mit ein wenig Arbeit verbunden, daher drängt es mir gerade nicht.

TurboMagic 14. Jul 2020 21:39

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Rollo62: bei aktiver Subskription ggf. Mal ein offizielles Support-Ticket bei EMBT anlegen. Dann muss sich das jemand von denen anschauen, der evtl. noch einen neuen Tipp hat.

Rollo62 15. Jul 2020 07:00

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Ok Supportanfrage kann ich parallel versuchen, aber ich suche eine schnellere Lösung bis zum August.

Ich denke es hängt mit den API-Anforderungen beim SDK von API-26 auf API-29 zusammen,
denn ich hatte gestern nochmal alle relevanten Source-Units von Rx10.3.3 mit Rx10.4 verglichen
(zu Location, Bluetooth, Permissions, etc.), die sind exakt gleich geblieben (bis auf Copyright-Datum).

In den Rx10.4 Sourcen hatte ich schon Alles zig Mal durchgeschaut, auch in den verschiedenen Android-Foren, Android-Developer, etc. kann ich keinen Hinweis finden.
Alles wie im Minimal-Beispiel sollte so funktionieren, auch noch unter API-29.

Ich vermute mal das die Rx10.3.3 Kompilate dann auch nicht mehr durch den Review kommen,
wenn nicht API-29 unterstützt wird.
Oder hast Du dein Android schon auf API-29 upgedatet ?
Vermutlich hat Rx10.3.3 mit API-29 dann die gleichen Probleme.

Ich werde mal schauen wie ich das Android-API sicher updaten kann, vielleicht ist da ja ein Bug drin, und es hilft ein Update dort.
Normalerweise vermeide ich sowas, und habe das zuletzt vor 4 Jahren machen müssen, ich versuche immer möglichst mit "Werkseinstellungen" der IDE durchzukommen :stupid:

Das Android-API Update müsste ich nur vorsichtig machen, ohne das mir der Rest abraucht,
sonst könnte ich statt einem neuen gleich 20 neue Fehler bekommen.

philipp.hofmann 15. Jul 2020 08:11

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Ich bin mit 10.3.3 noch auf dem Android 26.1.1-SDK unterwegs. Wie kann ich ein Android 29/30-SDK hinzufügen? Wenn ich im SDK-Manager "Hinzufügen"+"Neue hinzufügen" klicke und die Pfade auf das Android 30-SDK und 21-NDK setze, sagt er mit dann, dass ich schon ein "Android SDK 26.1.1" hätte. Sonst würde ich das mal glatt ausprobieren. So lange ich ja auch nicht mehr bis November (und dann ist Android-29 für Updates Pflicht). Ich werde mich aber wahrscheinlich auch nächste Woche mit Delphi 10.4 auseinander setzen, dann habe ich es automatisch.

Rollo62 15. Jul 2020 09:02

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Ja das manuelle Updaten wollte ich Vermeiden, das müsste so wie Du beschrieben hast funktionieren.
Eventuell noch ein paar Pfade im IDE SDK-Manager umbiegen.

Ich habe es gerade unter 10.3.3 getestet, und die Projekte nochmal komplett unter 10.3.3 und 10.4 angelegt.

Meine Ausgangsbasis ist
Zitat:

//## Rx10.3.3:
//## - Android SDK Tools : 25.2.5
//## - Android SDK Build-tools: 28.0.2
//## - Android API : 26 Rev 2
//##
//## Rx10.4 Pacth 1:
//## - Android SDK Tools : 25.2.5
//## - Android SDK Build-tools: 29.0.6
//## - Android API : 29 Rev 4
Ich habe in 10.4 (und hatte soweit ich noch rückdenken kann in 10.3.3) keine Updates im android gemacht,
also so sollte es nach der IDE-Neuinstallation aussehen.

Ich habe den erweiterten Test7 mit allen Optionen für Rx10.4 und 10.3.3 hier hochgeladen.
https://en.delphipraxis.net/topic/31...&comment=25305

Das Ergebnis bleibt gleich, Rx10.3.3 funktioniert wie es soll, Rx10.4 mit obiger API zickt.

Werde wohl ein Update morgen versuchen, in der Hoffnung das es wieder rund läuft.
(Backup der VM nicht vergessen :stupid:)

Hofix2004 26. Jul 2020 19:24

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Ist jemand hier schon weitergekommen, warum Projekte mit BLE auf Android mit Delphi 10.3 die benötigten Permissions auf BLE bekommen, aber mit Delphi 10.4 nicht mehr?

Hofix2004 26. Jul 2020 19:34

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
... bin gerade selbst darauf gekommen, statt ACCESS_COARSE_LOCATION bracht es jetzt ACCESS_FINE_LOCATION

philipp.hofmann 29. Jul 2020 20:17

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Also ich habe jetzt auch mal intensiv getestet und grundsätzlich funktioniert bei mir sowohl Delphi 10.3.3 als auch 10.4 (Patch 3) mit BLE und zwar sowohl mit Android-9 als auch Android-10.
Nur manchmal funktioniert bei mir
res:=bleManager.ble.SubscribeToCharacteristic(bleD eviceClassic,FMeasurementGattCharact);
nicht. Da bin ich noch am suchen, was dies auslösen kann.

Rollo62 29. Jul 2020 20:35

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1470756)
Also ich habe jetzt auch mal intensiv getestet und grundsätzlich funktioniert bei mir sowohl Delphi 10.3.3 als auch 10.4 (Patch 3) mit BLE und zwar sowohl mit Android-9 als auch Android-10.

Hattest Du mal mein Demo-Projekt geladen, mit dem aktuellen Android 29 SDK ?
https://en.delphipraxis.net/applicat...nt.php?id=2542

Müsste einfach nur in Rx10.4 geladen und gestartet werden.
Beim ersten Scan wird die Permissions's Abfrage gemacht, aber BLE startet nicht.
Erst wenn die Permissions zu der App in den Settings einmal hin und hergeändert wurde.

Sollte zumindest bei Dir genauso sein, denn ich habe hier auch ein clean installiertes Rx10.4.
Und auch das Android SDK ist 1:1 frisch installiert.

Falls es doch beim ersten Mal scannt, ohne das man in den Android Settings hin- und hersetzen muss,
würde mich das sehr wundern.
Was wäre dann anders in deiner Konfiguration als hier ?
Was jetzt an API-29 hakt weiss ich immer noch nicht, das werde ich nächste Woche weiter untersuchen.

philipp.hofmann 30. Jul 2020 10:23

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Hi Rollo,

jetzt läuft das Demo-Projekt auch bei mir. Ich habe drei Anpassungen vorgenommen:

a) In allen Manifest-Templates die ACCESS_BACKGROUND_LOCATION aufgenommen:

Code:
    <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <%uses-permission%>
b) ACCESS_FINE_LOCATION aufgenommen (war unter Delphi 10.3.3 noch nicht notwendig, ab Delphi 10.4 aber scheinbar schon)

Delphi-Quellcode:
procedure TForm1.Request_LC;
var
    LPermission_LC: String;
    LPermission_LF: String;
    LPermission_LB: String;

begin

    // Location Permissions
    LPermission_LC := JStringToString( TJManifest_permission.JavaClass.ACCESS_COARSE_LOCATION );
    LPermission_LF := JStringToString( TJManifest_permission.JavaClass.ACCESS_FINE_LOCATION );
    LPermission_LB := CPermission_AccessBackgroundLocation;

    if CheckBox1.IsChecked then
    begin
        Memo1.Lines.Insert( 0, 'Request LOCATION permission WITH BG ...' );

        PermissionsService.RequestPermissions(
              [   LPermission_LC
                , LPermission_LF
                , LPermission_LB ]
            , EvOnRequestPermissionsResult_LC
            , nil // DisplayRationale
            );
    end
    else
    begin
        Memo1.Lines.Insert( 0, 'Request LOCATION permission FG only ...' );

        PermissionsService.RequestPermissions(
              [   LPermission_LC, LPermission_LF ]
            , EvOnRequestPermissionsResult_LC
            , nil // DisplayRationale
            );
    end;


end;
c) Die Permission-Result-Methode dementsprechend angepasst:

Delphi-Quellcode:
procedure TForm1.EvOnRequestPermissionsResult_LC(       Sender      : TObject;
                                                  const APermissions : TArray<string>;
                                                  const AGrantResults: TArray<TPermissionStatus>);
var i:integer;
begin


    if CheckBox1.IsChecked then
    begin

        if Length(AGrantResults) >= 3 then
        begin
            if (AGrantResults[0] = TPermissionStatus.Granted ) and
               (AGrantResults[1] = TPermissionStatus.Granted ) and
               (AGrantResults[2] = TPermissionStatus.Granted ) then
            begin
                 Memo1.Lines.Insert( 0, 'Permission LOCATION w/ BG granted' );

                 FRequestSequence := 1;
            end
            else
            begin
                for i:=Length(AGrantResults)-1 downto 0 do
                begin
                  if (AGrantResults[i] = TPermissionStatus.Granted) then
                    Memo1.Lines.Insert( 0, IntToStr(i)+ ': Permission granted' )
                  else
                    Memo1.Lines.Insert( 0, IntToStr(i)+ ': Permission not granted' );
                end;
                Memo1.Lines.Insert( 0, 'Permission LOCATION w/ BG not fully granted' );
                FRequestSequence := 0;
            end;
        end
        else
        begin
             Memo1.Lines.Insert( 0, 'Permission LOCATION w/ BG error' );

             FRequestSequence := 0;
        end;


    end
    else
    begin

        if Length(AGrantResults) >= 2 then
        begin
            if (AGrantResults[0] = TPermissionStatus.Granted ) and
               (AGrantResults[1] = TPermissionStatus.Granted ) then
            begin
                 Memo1.Lines.Insert( 0, 'Permission LOCATION FG granted' );

                 FRequestSequence := 1;
            end
            else
            begin
                for i:=Length(AGrantResults)-1 downto 0 do
                begin
                  if (AGrantResults[i] = TPermissionStatus.Granted) then
                    Memo1.Lines.Insert( 0, IntToStr(i)+ ': Permission granted' )
                  else
                    Memo1.Lines.Insert( 0, IntToStr(i)+ ': Permission not granted' );
                end;
                Memo1.Lines.Insert( 0, 'Permission LOCATION FG not fully granted' );
                FRequestSequence := 0;
            end;
        end
        else
        begin
             Memo1.Lines.Insert( 0, 'Permission LOCATION FG error' );

             FRequestSequence := 0;
        end;


    end;

end;
Je nach Android-Version bekommt man in der Permission-Result-Methode jetzt auch ein "Not fully granted" zurück und muss dann z.B. intern wissen, dass für Android 5.x nur die erste von hier dreien Permission erlaubt sein muss.

Damit ging der Scan (reicht dir das als Result?) auf einem Android-9 und einem Android-10-Device.

Grüße, Philipp

Rollo62 30. Jul 2020 12:53

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Dankesehr fürs Testen.


a) In allen Manifest-Templates die ACCESS_BACKGROUND_LOCATION aufgenommen:
--> Dafür hatte ich ja zwei Versionen Rx1033/Rx1040 im Projekt drin, ich hatte extra zwei Projekte angelegt (10.3.3, 10.4), mit unterschiedlichen Setups.
--> In Rx10.3.3 sollte das ACCESS_BACKGROUND_LOCATION nicht nötig sein ( ging bisher auch ohne).

b) ACCESS_FINE_LOCATION aufgenommen (war unter Delphi 10.3.3 noch nicht notwendig, ab Delphi 10.4 aber scheinbar schon)
--> Seltsam, ich hatte bisher sowieso immer beide Coarse/Fine Permissions gesetzt.
Wenn das gefehlt hätte wäre das peinlich, ich schau nochmmal nach.
Ich hatte soviel hin- und hergeändert, vielleicht liegt es einfach nur daran.
Deshalb fände ich ein mehr textbasiertes Optionen-Setup besser, dann kann man besser vergleichen.



c) Die Permission-Result-Methode dementsprechend angepasst:
Je nach Android-Version bekommt man in der Permission-Result-Methode jetzt auch ein "Not fully granted" zurück und muss dann z.B. intern wissen, dass für Android 5.x nur die erste von hier dreien Permission erlaubt sein muss.
--> Klar, da hatte ich auch zwei Versionen gemacht.


Sehr seltsam.
Ich werde mir die ganzen Settings nochmal ansehen, vielleicht war es wirklich nur ein Typo.
Das war aber schon die 7. Version, deshalb bin ich mir eigentlich sicher das es OK war.

Könntest Du mir bitte die Version, welche bei Dir unter Rx10.4 läuft nochmal zurückschicken ?
Damit ich das hier direkt 1:1 Tresten kann.

philipp.hofmann 30. Jul 2020 13:55

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bitte schön.

philipp.hofmann 30. Jul 2020 16:28

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Die Version läuft so übrigens auch mit Delphi 10.3.3. Das man zwei Permissions erfragt, die man dort noch nicht "braucht" tut nicht weh. Wie gesagt, diese werden nur je nach Android-OS-Version nicht bestätigt, was aber die Funktionalität nicht einschränkt. Dies muss einem bei der Ausgabe, wenn man etwas "not granted" war, nur klar sein, denn auch dort kommen dann drei Permissions zurück und die "unbekannten" sind einfach nicht bestätigt.

Rollo62 30. Jul 2020 16:35

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Dankesehr für die Unterstützung Phillip,

Ich glaube ich habe das Problem gefunden ( das war wohl meiner Einer ).

Ich habe früher immer beide Permissions COARSE und FINE gesetzt, um Bluetooth zu aktivieren.
Jetzt wollte ich mal optimieren und bin ziemlich felsenfest davon ausgegangen das BLE mit COARSE reicht.

Woher ich diese fixe Idee hatte kann ich gar nicht mehr nachvollziehen (ich könnte schwören aus den Android Specs.),
jedenfalls sagt die Android-Doku was Anderes aus:

Zitat:

The other permission that you must declare is ACCESS_FINE_LOCATION. Your app needs this permission because a Bluetooth scan can be used to gather information about the location of the user. This information may come from the user's own devices, as well as Bluetooth beacons in use at locations such as shops and transit facilities.
Also sollte nur FINE reichen, .... Puuuh :cyclops:

Naja, ich ändere es jetzt so bei mir ab das auch COARSE oder FINE akzeptiert wird,
aber FINE auf jeden Fall immer da sein muss.

Irgendwie waren da wohl zu viele Bäume und zu wenig Wald :oops:

P.S.: Was mich wieder mal bestärkt in Regel 1: "neven change a running system"

Ich habe jetzt die letzen Updates im PlayStore unter Rx10.3.3 soweit erledigt.
Jetzt wollte ich mich dem Problem unten widmen, scheint dann aber schon gelöst dank der Erkenntnisse hier,
und ich kann mit gutem Gewissen auf Rx10.4 wechseln.
Das es ansonsten unter 10.4 läuft hatte ich schon getestet, dann wird nächste Woche Einiges an Updates auf mich zukommen.

philipp.hofmann 30. Jul 2020 18:47

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Meine Erfahrung sagt auch, dass bisher FINE nicht notwendig war und auch ich hatte da optimiert und dies nun geändert. Mein Problem mit dem Subscribe habe ich auch lösen können. Android mage es nicht, wenn noch ein ReadCharacteristic läuft und man parallel ein Subscribe abschickt. Normalerweise kein Problem. In einem Fall nutze ich aber zwei Services von dem gleichen BLE-Device und beim zweiten Service braucht ich das Subscribe, beim ersten hatte ich nur ein paar Daten abgefragt. Da muss der erste Service zuerst inklusive der ReadCharacteristic-Antworten (welche ja asynchron kommen) abgearbeitet sein, bevor ich mit dem zweiten beginnen darf.

Rollo62 30. Jul 2020 18:59

AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
 
Damit meinst Du wohl wenn eine Verbindung getrent wird / werden soll, oder gelöscht werden soll.
Das Verbinden geht meist einfach und direkt, aber wenn ein Gerät wegfällt oder disconnected wird ...
Das kann dann extrem tricky werden wenn da noch Kommandos irgendwo hängen,
ich denke man muss auch einfach warten bis die Phones Ressourcen freigeben und einem wieder den Zugriff erlauben.

Um das zu Beschleunigen habe ich schon alles Mögliche versucht (fällt bei mir unter Stichwort Kill BLE), und auch gewisse Timings zwischen Befehlen sind dabei einzuhalten.

Ich arbeite auch noch ein einem neuen, großen Update meiner Libraries, die 6. BLE Version jetzt,
aber da komme ich erst zu wenn ich noch 1000 Dinge vorher erledigt habe.

Solange es stabil läuft, besser Finger davon lassen, sonst passiert am Ende das siehe unten :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz