IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

FMX - ANDROID - problème de targetSdkVersion depuis passage à Delphi 12.1


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gérant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 20
    Points
    20
    Par défaut FMX - ANDROID - problème de targetSdkVersion depuis passage à Delphi 12.1
    Salut à toutes et tous,

    Je migre une application FMX compilée avec Delphi 10.4.2, avec pour cible Android 64 ou Windows 64.

    Windows : OK 0 problème

    Android : passé les quelques autres soucis de version de Java et de chemins pas bien récupérés par le setup, et corrigés, je builde : OK

    Je déploie : OK
    mais au lancement j'ai cette erreur :
    Le projet XXX.apk a déclenché la classe d'exception EJNIException avec le message 'java.lang.SecurityException: Settings key: <bluetooth_name> is only readable to apps with targetSdkVersion lower than or equal to: 31'.

    Précision : JE N'AI PAS de BLUETOOTH dans mon fichier AndroidManifest.
    1 - Je ne sais donc pas d'où il sort ce bluetooth_name qui n'ai dans aucun fichier de mes dossiers d'ailleurs.

    ci-dessous mon fichier androidmanifest.xml déployé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <?xml version="1.0" encoding="utf-8"?>
    <!-- BEGIN_INCLUDE(manifest) -->
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="fr.YYY.XXX.dev"
        android:versionCode="1"
        android:versionName="1.0.0"
        android:installLocation="auto">
        <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="31" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="31" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="31" />
     
        <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
        <application android:persistent="False"
            android:restoreAnyVersion="False"
            android:label="XXX"
            android:debuggable="true"
            android:largeHeap="False"
            android:icon="@drawable/ic_launcher"
            android:theme="@style/AppTheme"
            android:hardwareAccelerated="true"
            android:resizeableActivity="false"
            android:requestLegacyExternalStorage="true"
    		android:usesCleartextTraffic="true"
    		android:networkSecurityConfig="@xml/network_security_config">
     
            <!-- Trigger Google Play services to install the backported photo picker module. -->
            <service
                android:name="com.google.android.gms.metadata.ModuleDependencies"
                android:enabled="false"
                android:exported="false"
                tools:ignore="MissingClass">
                <intent-filter>
                    <action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
                </intent-filter>
     
                <meta-data android:name="photopicker_activity:0:required" android:value="" />
            </service>
     
            <!-- Our activity is a subclass of the built-in NativeActivity framework class.
                 This will take care of integrating with our NDK code. -->
            <activity
                android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:exported="true"
                android:label="CompaCare"
                android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"
                android:launchMode="singleTask">
                <!-- Tell NativeActivity the name of our .so -->
                <meta-data android:name="android.app.lib_name" android:value="XXX" />
     
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
     
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
     
            <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />
     
        </application>
    </manifest>
    <!-- END_INCLUDE(manifest) -->
    Par défaut le targetSdkVersion était = 34, je l'ai mis à 31. idem.

    Est-ce que une bonne âme aurait une solution svp ?

    Merci !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 658
    Points : 25 436
    Points
    25 436
    Par défaut
    Obtenir le nom de l'appareil sur lequel un programme Delphi s'exécute. te donnera l'historique de l'utilisation de 'bluetooth_name' remplacé par la suite par 'device_name'

    Tu as peux être sans le savoir une bibliothèque qui utilise un extrait du code mentionné par l'article ci-dessus, c'est peut-être la cause du problème.


    Cette erreur se trouve sur pas mal de forum concernant Android, un problème lié à cette plateforme en particulier.

    Crée une autre application en cible 31 et vérifie que la valeur est bien prise en compte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    uses
      Androidapi.JNI.Os;
     
    ...
     
      if TJBuild_VERSION.JavaClass.SDK_INT = 31 then
        ...
      else
         ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre à l'essai
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gérant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par JMGWAY Voir le message
    Salut à toutes et tous,

    Je migre une application FMX compilée avec Delphi 10.4.2, avec pour cible Android 64 ou Windows 64.

    Windows : OK 0 problème

    Android : passé les quelques autres soucis de version de Java et de chemins pas bien récupérés par le setup, et corrigés, je builde : OK

    Je déploie : OK
    mais au lancement j'ai cette erreur :
    Le projet XXX.apk a déclenché la classe d'exception EJNIException avec le message 'java.lang.SecurityException: Settings key: <bluetooth_name> is only readable to apps with targetSdkVersion lower than or equal to: 31'.

    Précision : JE N'AI PAS de BLUETOOTH dans mon fichier AndroidManifest.
    1 - Je ne sais donc pas d'où il sort ce bluetooth_name qui n'ai dans aucun fichier de mes dossiers d'ailleurs.

    ci-dessous mon fichier androidmanifest.xml déployé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <?xml version="1.0" encoding="utf-8"?>
    <!-- BEGIN_INCLUDE(manifest) -->
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="fr.YYY.XXX.dev"
        android:versionCode="1"
        android:versionName="1.0.0"
        android:installLocation="auto">
        <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="31" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="31" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="31" />
     
        <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
        <application android:persistent="False"
            android:restoreAnyVersion="False"
            android:label="XXX"
            android:debuggable="true"
            android:largeHeap="False"
            android:icon="@drawable/ic_launcher"
            android:theme="@style/AppTheme"
            android:hardwareAccelerated="true"
            android:resizeableActivity="false"
            android:requestLegacyExternalStorage="true"
    		android:usesCleartextTraffic="true"
    		android:networkSecurityConfig="@xml/network_security_config">
     
            <!-- Trigger Google Play services to install the backported photo picker module. -->
            <service
                android:name="com.google.android.gms.metadata.ModuleDependencies"
                android:enabled="false"
                android:exported="false"
                tools:ignore="MissingClass">
                <intent-filter>
                    <action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
                </intent-filter>
     
                <meta-data android:name="photopicker_activity:0:required" android:value="" />
            </service>
     
            <!-- Our activity is a subclass of the built-in NativeActivity framework class.
                 This will take care of integrating with our NDK code. -->
            <activity
                android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:exported="true"
                android:label="CompaCare"
                android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"
                android:launchMode="singleTask">
                <!-- Tell NativeActivity the name of our .so -->
                <meta-data android:name="android.app.lib_name" android:value="XXX" />
     
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
     
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
     
            <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />
     
        </application>
    </manifest>
    <!-- END_INCLUDE(manifest) -->
    Par défaut le targetSdkVersion était = 34, je l'ai mis à 31. idem.

    Est-ce que une bonne âme aurait une solution svp ?

    Merci !

    Après de longues recherches : j'ai identifié la source du soucis dans une unité (évidemment j'en ai besoin...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    unit uGetDeviceName;
    
    interface
    
    function getDeviceName: string;
    
    implementation
    
    {$IF Defined(MSWINDOWS)}
    
    uses system.sysutils;
    {$ELSEIF Defined(IOS)}
    
    uses
      iOSapi.CocoaTypes, iOSapi.Foundation, Macapi.ObjectiveC, Macapi.helpers;
    
    type
      UIDeviceClass = interface(NSObjectClass)
        ['{A2DCE998-BF3A-4AB0-9B8D-4182B341C9DF}']
        function currentDevice: Pointer; cdecl;
      end;
    
      UIDevice = interface(NSObject)
        ['{70BB371D-314A-4BA9-912E-2EF72EB0F558}']
        function localizedModel: NSString; cdecl;
        function model: NSString; cdecl;
        function name: NSString; cdecl;
        function systemName: NSString; cdecl;
        function systemVersion: NSString; cdecl;
        function uniqueIdentifier: NSString; cdecl;
      end;
    
      TUIDevice = class(TOCGenericImport<UIDeviceClass, UIDevice>)
      end;
    {$ELSEIF Defined(MACOS)}
    
    uses Macapi.Foundation, Macapi.helpers;
    {$ELSEIF Defined(ANDROID)}
    
    uses Androidapi.JNI.Os, Androidapi.JNI.Provider, Androidapi.helpers;
    {$ENDIF}
    
    function getDeviceName: string;
    {$IF Defined(IOS)}
    var
      hote: UIDevice;
    {$ELSEIF Defined(MACOS)}
    var
      hote: NSHost;
    {$ENDIF}
    begin
    {$IF Defined(MSWINDOWS)}
      Result := GetEnvironmentVariable('COMPUTERNAME');
      if ('' = Result) then
        Result := GetEnvironmentVariable('HOSTNAME');
    {$ELSEIF Defined(IOS)}
      hote := TUIDevice.Create;
      Result := NSStrToStr(hote.name);
    {$ELSEIF Defined(MACOS)}
      hote := tnshost.Create;
      Result := NSStrToStr(hote.localizedName);
    {$ELSEIF Defined(ANDROID)}
      Result := JStringToString(TJSettings_Secure.JavaClass.getString
        (TAndroidHelper.ContentResolver, StringToJString('bluetooth_name')));
      if ('' = Result) then
        Result := JStringToString(TJSettings_Global.JavaClass.getString
          (TAndroidHelper.ContentResolver, StringToJString('device_name')));
      if ('' = Result) then
        Result := JStringToString(tjbuild.JavaClass.model);
      if ('' = Result) then
        Result := JStringToString(tjbuild.JavaClass.DISPLAY);
    {$ELSE}
      Result := GetEnvironmentVariable('HOSTNAME');
    {$ENDIF}
    end;
    
    end.
    Mais pourquoi donc, cela fonctionne-t-il bien avec une Compil en 10.4.2 et plus en 12.1, en sachant que j'ai la même tablette ??
    une idée ?

    Merci !

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 658
    Points : 25 436
    Points
    25 436
    Par défaut
    Citation Envoyé par JMGWAY Voir le message
    Après de longues recherches : j'ai identifié la source du soucis dans une unité (évidemment j'en ai besoin...)
    C'est pourtant exactement ce qu'explique le lien fourni à la pause déjeuner



    C'est à cause de Android qui change ses trucs

    tu peux donc écrire comme évoqué précédemment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      Result := '';
      if TJBuild_VERSION.JavaClass.SDK_INT <= 31 then
        Result := JStringToString(TJSettings_Secure.JavaClass.getString
          (TAndroidHelper.ContentResolver, StringToJString('bluetooth_name')));
     
      if ('' = Result) then
        Result := JStringToString(TJSettings_Global.JavaClass.getString
          (TAndroidHelper.ContentResolver, StringToJString('device_name')));
      if ('' = Result) then
        Result := JStringToString(tjbuild.JavaClass.model);
      if ('' = Result) then
        Result := JStringToString(tjbuild.JavaClass.DISPLAY);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 193
    Points : 41 418
    Points
    41 418
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est à cause de Android qui change ses trucs
    Oui, c'est exactement ça et c'est c...t
    Une astuce consistait à supprimer le fichier manifeste, une autre à faiire un clic droit sur bibliothèque
    Nom : Capture.PNG
Affichages : 108
Taille : 5,9 Ko
    réinitialiser les fichiers système ....
    je commencerai par cette dernière
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    2 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2 006
    Points : 6 287
    Points
    6 287
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Oui, c'est exactement ça et c'est c...t
    Une astuce consistait à supprimer le fichier manifeste, une autre à faiire un clic droit sur bibliothèque
    Nom : Capture.PNG
Affichages : 108
Taille : 5,9 Ko
    réinitialiser les fichiers système ....
    je commencerai par cette dernière
    Je viens de terminer la migration de plusieurs app Android de Delphi 10.4.2 vers Delphi12.

    Je confirme:

    1° Il faut supprimer le fichier manifest à la racine de votre projet (il sera recréé automatiquement lors de la prochaine compilation de votre projet)... Ce point est indispensable parce que le manifest par défaut a changé avec Delphi12

    2° Il faut réinitialiser les bibliothèques sinon la compilation va planter avec un message d'erreur incompréhensible. Donc clic droit sur le répertoire "bibliothèque" de votre projet et sélectionner la commande "réinitialiser... par défaut"

    3° Je n'ai pas eu à réinitialiser des "fichiers systèmes"

    4° Il peut y avoir du code a changer, plus particulièrement la gestion des droits Android (des fonctions ont gardé le même nom mais exigent par exemple des paramètres supplémentaire)! Cela va se voir immédiatement parce que Delphi12 va vous annoncer la présence d'erreurs

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2015, 14h06
  2. Problème depuis passage de IE6 à IE7
    Par hfranck dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 08/01/2007, 11h23
  3. erreur de segmentation depuis passage a OO
    Par hansaplast dans le forum C++
    Réponses: 15
    Dernier message: 27/04/2006, 12h27
  4. [Kylix] Passage Delphi/Kylix
    Par JP.NUAGE dans le forum EDI
    Réponses: 2
    Dernier message: 03/04/2006, 19h29
  5. Depuis EDI DELPHI : Access Violation
    Par powerlog dans le forum EDI
    Réponses: 1
    Dernier message: 03/08/2005, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo