A partir d'Android 10 pour récupérer l'identifiant de l'appareil il faut "l'autorisation de privilège READ_PRIVILEGED_PHONE_STATE". Malheureusement cette autorisation de privilège ne peut pas être accordée aux applications tierces (non système).

 

https://developer.android.com/about/versions/10/privacy/changes#non-resettable-device-ids

 

Les fonctions SysIMEI et SysNumSérie ne retournent donc plus de valeur sous Android 10.

 

Il existe malgré tout deux solutions.

 

La première est de créer une application de type "device owner", cela peut être fait dans une application Android WINDEV Mobile à partir de la version 25 en cochant une option dans la description de la configuration du projet. Mais attention, il ne peut y avoir qu'une seule application "device owner" sur un périphérique Android, et une application "device owner" ne peut pas être désinstallée sauf à faire une ré-initialisation complète de l'appareil.

 

La seconde possibilité est de créer dans un dossier de l'appareil un fichier contenant un GUID qui permettra d'identifier l'appareil. Ici le risque est qu'en cas de suppression du fichier, l'appareil sera considéré comme un nouvel appareil.

 

Voici un exemple de code :

 

PROCÉDURE IdentifiantAppareil()


sIdentifiant est une chaîne

sFichierIdentifiant est une chaîne

 

//récupère IMEI appareil

sIdentifiant=SysIMEI("")


//IMEI récupéré ?

SI sIdentifiant~="" ALORS


//pas de IMEI : c'est le cas si il n'y a pas de carte SIM, et le IMEI plus récupérable à partir d'Android 10

//Construction d'un nom de fichier dans un dossier "public" (non spécifique à l'application) qui contient/va contenir // un identifiant unique

sFichierIdentifiant =SysRepStockageExterne(1,ssePublic)+[fSep]+"systemeid.bin"


//le fichier existe ?

SI PAS fFichierExiste(sFichierIdentifiant) ALORS

//non, on génère un identifiant unique (un GUID)

fSauveBuffer(sFichierIdentifiant,DonneGUID(guidBrut))

FIN


//Lecture de l'identifiant

sIdentifiant=fChargeBuffer(sFichierIdentifiant)

FIN

 

 

< Retour

7 commentaires

François SCHAAL
29/07/2020 - 08:08 - Répondre
Cet article, très intéressant, n'indique pas si SysIdentifiant() retourne une valeur sous Android 10.

LOIC HAMEL
29/07/2020 - 08:32 - Répondre
Bonjour, SysIdentifiant ne permet pas d’identifier un appareil mais une application sur un appareil. Sa valeur dépend de la signature d’application.

DAVID LAPORAL
29/07/2020 - 14:30 - Répondre
Bonjour, à propose SysIdentifiant, la valeur retournée dépend de la signature de l'application, mais cette signature est-elle amenée à changer? En cas de changement de version de l'app par exemple, suite à une MAJ de Windev Mobile, ou autre?

Jason
14/10/2020 - 10:22 - Répondre
Documentation PcSoft : SysIdentifiant (Fonction) En anglais : SysIdentifier Renvoie l’identifiant unique de l’appareil mobile en cours. L’identifiant de l'appareil est généré aléatoirement lors du tout premier démarrage de l’appareil et reste inchangé durant toute la vie de l’appareil. Seule exception : cet identifiant peut être réinitialisé en cas de restauration des paramètres d’usine. -- Donc est ce qu'il est possible d'utiliser SysIdentifier pour identifier un appareil pour l'associer à un client ? J'ai des retour sur des appareil en Android 10 et les fonction SysIMEI et SysNumSerie font planté mes applications (c'est pas juste ça renvoi zéro). Finalement je pense que le meilleur moyen est la génération de clé mais comment la stocker de façon à ce qu'elle ne soit pas supprimé par erreur ?

Jason
14/10/2020 - 10:50 - Répondre
J'ai trouvé ma réponse plus loin dans la documentation. Effectivement SysIdentifiant est un clé de signature, utilisateur et appareil. Donc si une de ces valeurs change l'appareil n'est plus le même selon l'application. Je pense que je vais utiliser cette méthode car ces changements ne sont pas fréquent.

Falk Liyabi
09/02/2021 - 13:18 - Répondre
Génial cette explication

Xavier GUILBEAUD
26/01/2023 - 07:37 - Répondre
Une solution semble avoir été trouvée par Alain GAUMET en 2012 et semble fonctionner encore même avec Android 10 ou 11 ! (Est-ce la même chose que la fonction "SysIdentifiant()" proposée par Windev ? Je n'ai pas testé...) Regardez à la fin de ce thread sur le forum : https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windevmobile/9557-nb0-unique-sur-android/read.awp

Publier un commentaire : 
Votre adresse email ne sera pas publiée