web-dev-qa-db-fra.com

Comment puis-je récupérer un numéro de série de carte SD dans Android 7.0+?

Dans certaines versions d’Android et d’autres variantes de Linux, il est possible d’obtenir le numéro de série d’une carte SD montée, par exemple. en lisant le contenu de /sys/class/mmc_Host/mmc0/mmc0:0001/serial ou /sys/block/mmcblk0/device/serial (les nombres spécifiques peuvent varier). Lors de mes tests, cela a fonctionné de manière assez fiable, tant que la carte SD est insérée dans un emplacement de carte SD intégré (non monté via un adaptateur USB).

Mais depuis Android 7.0 Nougat, le OS est censé bloquer l'accès à cette information, du moins sur certains appareils. J'ai testé cela en exécutant une application de test sur un nouvel Alcatel A30 GSM (Android 7.0). En fait, l'approche ci-dessus échoue avec une erreur d'autorisation:

Java.io.FileNotFoundException: /sys/block/mmcblk0/device/serial (Permission denied)
at Java.io.FileInputStream.open(Native Method)

Pour référence future, nous (testons à partir d'un shell adb) avons les autorisations suivantes pour ls -ld:

  • /sys/class/mmc_Host mais pas /sys/class/mmc_Host/mmc0
  • /sys/block mais pas /sys/block/mmcblk0

Puisque l'approche ci-dessus ne fonctionne plus,

  • Existe-t-il un autre moyen d'obtenir le numéro de série d'une carte SD montée dans Android 7.0 ou une version ultérieure?

  • À défaut, existe-t-il une documentation ou une autre déclaration de Google sur les projets visant à fournir ou non cette fonction? Je n'ai rien trouvé dans Android Issue Tracker , mais je ne cherche peut-être pas correctement.

Pour m'assurer que la question est claire, je parle de ce qu'une application ordinaire (non système) exécutée sur un périphérique non root peut faire, avec toutes les autorisations qu'une application peut normalement demander et recevoir.

Pour votre information, le répertoire /sbin ne semble pas lisible, aussi des commandes telles que /sbin/udevadm ne sont pas une option.

23
LarsH

Dans Android N, l'accès à/sys nad/proc était considérablement restreint. Il s'agissait de fournir des sandbox plus stricts dans lesquels les applications s'exécutaient. Ceci est expliqué dans https://issuetracker.google.com/issues/37091475 comme intentionnel. En réalité, cela n’a pas été dit que toutes les données de/sys ne sont pas accessibles, et Google est ouvert pour autoriser l’accès à d’autres fichiers à partir de cet emplacement:

S'il y a des fichiers spécifiques dans/sys qui, à votre avis, devraient être disponibles pour les applications, mais ne le sont pas, veuillez créer un nouveau bogue permettant à la demande d'être évaluée. Par exemple,/sys/devices/system/cpu est disponible pour tous les processus. Il est donc inexact de dire que tout/sys est restreint. 

J'ai le mauvais pressentiment que Google apporte des modifications similaires à celles d'Apple, où il est interdit de gagner des identifiants matériels. Si cela n'est pas résolu, la solution consiste à utiliser des identifiants de compte Google. Mais je suis conscient que ce n'est pas toujours possible et qu'il faudra d'importants changements dans la logique métier (licences, etc.).

Espérons que votre rapport de bogue sera considéré comme positif. 

autre SO liée: Modifications apportées au système de fichiers dans Android Nougat

4
marcinj

Utilisez StorageVolume.getUuid () sur StorageVolume que vous obtenez de StorageManager.

La valeur est l'ID de volume attribué lors du formatage de la carte et sa longueur/format varie en fonction du type de système de fichiers. Pour FAT32, il s'agit de XXXX-XXXX, pour NTFS, de la chaîne hexagonale plus longue, pour le stockage de masse interne, elle renvoie la valeur null.

1
Pointer Null

adb Shell cat /sys/class/mmc_Host/mmc1/mmc1:*/cid

Vous pouvez aussi essayer

Sudo hwinfo --disk

pour obtenir des informations sur vos disques, y compris les cartes SD.

Essayez aussi

Sudo hdparm -I /dev/sdb | more 

0
Zed