![]() |
Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschaltet
Hallo zusammen,
ich habe ![]() Weil man dort so schön Bilder einfüge kann, verlinke ich mal auf ![]() 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 ![]() 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. |
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 |
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 ![]() 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. |
AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
Zitat:
auch wegen der kommenden ![]() 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. |
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. |
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.
|
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. |
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.
|
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:
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. ![]() 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:) |
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?
|
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
|
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. |
AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
Zitat:
![]() 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. |
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:
b) ACCESS_FINE_LOCATION aufgenommen (war unter Delphi 10.3.3 noch nicht notwendig, ab Delphi 10.4 aber scheinbar schon)
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <%uses-permission%>
Delphi-Quellcode:
c) Die Permission-Result-Methode dementsprechend angepasst:
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;
Delphi-Quellcode:
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.
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; Damit ging der Scan (reicht dir das als Result?) auf einem Android-9 und einem Android-10-Device. Grüße, Philipp |
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. |
AW: Android permissions mit Bluetooth LE und Location werden nicht direkt freigeschal
Liste der Anhänge anzeigen (Anzahl: 1)
Bitte schön.
|
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.
|
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:
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. |
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.
|
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 18:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz