wake-up-neo.com

Wie kann ich eine SD-Kartenseriennummer in Android 7.0+ abrufen?

In einigen Versionen von Android und anderen Varianten von Linux ist es möglich, die Seriennummer einer eingebauten SD-Karte zu erhalten, z. durch Lesen des Inhalts von /sys/class/mmc_Host/mmc0/mmc0:0001/serial oder /sys/block/mmcblk0/device/serial (bestimmte Nummern können variieren). In meinen Tests hat dies ziemlich zuverlässig funktioniert, solange die SD-Karte in einen eingebauten SD-Kartensteckplatz eingesetzt wird (nicht über USB-Adapter montiert).

Seit Android 7.0 Nougat soll das Betriebssystem jedoch den Zugriff auf diese Informationen blockieren, zumindest auf einigen Geräten. Ich habe dies getestet, indem ich eine Test-App auf einem neuen Alcatel A30 GSM (Android 7.0) ausgeführt habe. In der Tat schlägt der obige Ansatz mit einem Berechtigungsfehler fehl:

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

Als Referenz haben wir (zum Testen von einer Adb-Shell) die Berechtigung, ls -ld Folgendes zu tun:

  • /sys/class/mmc_Host aber nicht /sys/class/mmc_Host/mmc0
  • /sys/block aber nicht /sys/block/mmcblk0

Da der obige Ansatz nicht mehr funktioniert,

  • Gibt es eine andere Möglichkeit, die Seriennummer einer eingebauten SD-Karte in Android 7.0 oder höher zu erhalten?

  • Wenn dies nicht der Fall ist, gibt es Unterlagen oder andere Aussagen von Google zu Plänen, diese Funktion bereitzustellen oder nicht bereitzustellen? Ich habe in Android issue tracker nichts gefunden, aber ich suche vielleicht nicht richtig.

Um sicherzustellen, dass die Frage klar ist, spreche ich darüber, was eine normale (nicht systemgestützte) App, die auf einem nicht gerooteten Gerät ausgeführt wird, mit allen Berechtigungen ausführen kann, die eine App normalerweise anfordern und empfangen kann.

Zu Ihrer Information, das /sbin-Verzeichnis scheint nicht lesbar zu sein, daher sind Befehle wie /sbin/udevadm keine Option.

23
LarsH

In Android N wurde der Zugriff auf/sys nad/proc erheblich eingeschränkt. Dies dient dazu, strengere Sandboxen bereitzustellen, auf denen Anwendungen ausgeführt werden. Dies wird in https://issuetracker.google.com/issues/37091475 als Absicht erklärt. Eigentlich heißt es nicht, dass nicht auf alle Daten in/sys zugegriffen werden kann, und Google ist offen, um den Zugriff auf andere Dateien von diesem Speicherort aus zuzulassen:

Wenn bestimmte Dateien in/sys vorhanden sind, von denen Sie glauben, dass sie für Anwendungen verfügbar sein sollten, dies jedoch nicht ist, reichen Sie bitte einen neuen Fehler ein, in dem die Anforderung ausgewertet werden kann. Beispielsweise steht/sys/devices/system/cpu für alle Prozesse zur Verfügung. Daher ist es ungenau zu sagen, dass alle von/sys eingeschränkt sind. 

Ich habe ein schlechtes Gefühl, dass Google ähnliche Änderungen an Apple vornimmt, bei denen keine Hardware-IDs erworben werden dürfen. Wenn dies nicht behoben ist, verwenden Sie stattdessen Google-Konto-IDs. Ich bin mir jedoch bewusst, dass dies nicht immer möglich ist, und erfordert erhebliche Änderungen in der Geschäftslogik (Lizenzierung usw.).

Hoffentlich wird Ihr Fehlerbericht positiv bewertet. 

ein anderer verwandter SO fand ich: Dateisystemänderungen in Android Nougat

4
marcinj

Verwenden Sie StorageVolume.getUuid () in StorageVolume, das Sie von StorageManager erhalten.

Der Wert ist die Datenträger-ID, die während der Formatierung der Karte zugewiesen wurde. Die Länge/das Format hängt vom Dateisystemtyp ab. Für FAT32 ist es XXXX-XXXX, für NTFS ist es eine längere Hex-Zeichenfolge, für den internen Massenspeicher gibt es null zurück.

1
Pointer Null
public String getSDCARDiD()
{
    String sd_cid = null;
    try {

        File file = new File("/sys/block/mmcblk1");
        String memBlk;
        if (file.exists() && file.isDirectory()) {

            memBlk = "mmcblk1";
        } else {
            //System.out.println("not a directory");
            memBlk = "mmcblk0";
        }

        Process cmd = Runtime.getRuntime().exec("cat /sys/block/"+memBlk+"/device/cid");
        BufferedReader br = new BufferedReader(new InputStreamReader(cmd.getInputStream()));
        sd_cid = br.readLine();
        //System.out.println(sd_cid);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return sd_cid;
}

versuchen Sie dies: Referenz Original-Link: Android ID der SD-Karte programmgesteuert erhalten

0
Vasudev Vyas

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

Sie können es auch versuchen

Sudo hwinfo --disk

informationen zu Ihren Festplatten, einschließlich SD-Karten.

Probiere auch

Sudo hdparm -I /dev/sdb | more 

0
Zed