it-swarm.com.de

Wie lese ich die SD-Karten-ID?

Wie kann ich das CID-Register der SD-Karte, das eine Seriennummer und andere Informationen enthält, programmgesteuert lesen? Kann ich das über Android Java oder Native Code machen?

Danke im Voraus, Eric

15
Eric Hamilton

Hier ist ein Beispielcode zum Abrufen von SID und CID

if (isExteranlStorageAvailable()) {
    try {
        File input = new File("/sys/class/mmc_Host/mmc1");
        String cid_directory = null;
        int i = 0;
        File[] sid = input.listFiles();

        for (i = 0; i < sid.length; i++) {
            if (sid[i].toString().contains("mmc1:")) {
                cid_directory = sid[i].toString();
                String SID = (String) sid[i].toString().subSequence(
                        cid_directory.length() - 4,
                        cid_directory.length());
                Log.d(TAG, " SID of MMC = " + SID);
                break;
            }
        }
        BufferedReader CID = new BufferedReader(new FileReader(
                cid_directory + "/cid"));
        String sd_cid = CID.readLine();
        Log.d(TAG, "CID of the MMC = " + sd_cid);

    } catch (Exception e) {
        Log.e("CID_APP", "Can not read SD-card cid");
    }

} else {
    Toast.makeText(this, "External Storage Not available!!",
            Toast.LENGTH_SHORT).show();
}
12

Ich habe die CID meiner SD-Karte gefunden, indem ich mein Handy über USB an meinen Computer angeschlossen und das ADB-Tool (Android SDK) verwendet habe.

$ adb Shell
# cat /sys/block/mmcblk0/../../cid

Mein Telefon ist gerootet, daher bin ich mir nicht sicher, ob dies auf nicht gerooteten Telefonen möglich ist.

Probiere auch

$ adb Shell
# cd /sys/block/mmcblk0/../../
# ls
block                 fwrev                 preferred_erase_size
cid                   hwrev                 scr
csd                   manfid                serial
date                  name                  subsystem
driver                oemid                 type
erase_size            power                 uevent

Diese werden in der Kernel-Dokumentation http://www.mjmwired.net/kernel/Documentation/mmc/mmc-dev-attrs.txt erklärt.

7
delcypher

Ich habe dieses gemacht ... es hat bei mir funktioniert ... hoffe, es macht dich klar!

String getSDCARDiD()
    {
        try {

            File file = new File("/sys/block/mmcblk1");
            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;
    }
5
Aditya Nikhade

Wie BMB schrieb, können Sie den tatsächlichen Pfad der SD-Karte im/sys-Dateisystem nicht kennen./Sys implementiert jedoch auch Aliase, und Sie können die CID möglicherweise über/sys/block/mmcblk0/device/cid abrufen.

Beispielsweise ist/sys/block/mmcblk0 auf einem Tattoo mit Version 2.2 eine vom System automatisch hergestellte Verknüpfung zu /sys/devices/platform/msm_sdcc.2/mmc_Host/mmc1/mmc1:aaaa/block/mmcblk0.

4
Samuel Tardieu

Der einzige Code, den ich bisher gefunden habe, um die ID bereitzustellen, ist C++ oder C # http://jo0ls-dotnet-stuff.blogspot.com/2008/12/read-secure-digital-sd-card-serial.html
http://jo0ls-dotnet-stuff.blogspot.com/2008/12/read-cid-and-csd-c-implementation.html
Wenn Sie ein C++ - Entwickler sind, können Sie dies möglicherweise auf Android anwenden und zum Laufen bringen.

4
Paul Gregoire

Es gibt eine API in Android, um die Seriennummer der SD-Karte zu erhalten. Die Methode heißt getFatVolumeId (String mountPoint), wobei "mountPoint" der Name der SD-Karte ist (Sie erhalten diesen Namen, indem Sie Environment.getExternalStorageDirectory () aufrufen). GetFatVolumeId ist jedoch eine versteckte Funktion (oder eine vergessene Funktion). Sie möchten daher ein Paket in Ihrem Projekt mit dem Namen Android.os und der Klasse darin erstellen, um auf die native Methode zu verweisen, damit Sie es aufrufen können:

package Android.os;

public class FileUtils {
    public static native int getFatVolumeId(String mountPoint);
}

Und der Code lautet:

File SdCard = Environment.getExternalStorageDirectory();
int Serial = FileUtils.getFatVolumeId(SdCard.getName());

Siehe auch die Links

http://groups.google.com/group/Android-framework/browse_thread/thread/1abd18435ba20a67?pli=1 http://markmail.org/message/rdl4bhwywywhhiau#query:+page:1+mid: rdl4bhwywywhhiau + state: results

4
southerton

Es gibt keine Android-API, die dies ermöglicht, und ich kenne sie für eine allgemeine Lösung, die benötigt wird. Um Hintergrundinformationen bereitzustellen, ist die SD-Karte mit einem Hardware-Controller verbunden, der für die Geräteplattform spezifisch ist. Es ist möglich, den cid-Wert aus dem Linux/Sys-Dateisystem auszulesen, wenn Sie Ihre Plattform kennen. Das folgende Snippet funktioniert auf meinem Droid (TI-Omap-basierte Plattform), jedoch nicht auf Qualcomm-MSM-basierten Plattformen.

try {
        BufferedReader input = new BufferedReader(new FileReader("/sys/devices/platform/mmci-omap-hs.0/mmc_Host/mmc0/mmc0:aaaa/cid"));
        String sd_cid = input.readLine();
        Log.i("CID_APP", sd_cid);
    } catch (Exception e) {
        Log.e("CID_APP","Can not read SD-card cid");
    }

Auf einer anderen Plattform unterscheidet sich die von uns gesuchte sys-Datei. Es kann sogar zwischen verschiedenen Karten auf derselben Plattform variieren, da ich das nicht testen konnte. Auf MSM-basierten Geräten wäre der Pfad etwa /sys/devices/platform/msm_sdcc.1/mmc_Host/...

Da diese Hardwareabhängigkeit vom Auslesen des SD-Karten-CID abhängt, müsste ein Update der Android-API durchgeführt werden, das den allgemeinen Zugriff ermöglicht. Diese API müsste dann von jedem Gerätehersteller implementiert werden, um den richtigen SD-Karten-Controller-Treiber zuzuordnen.

3
BMB

für mmcblk0 einfach in Shell schreiben als:

cat /sys/block/mmcblk0/device/cid 
2750485344303847307cf6851900b99b

cat /sys/block/mmcblk0/device/serial 
0x7cf68519

sie können es einfach in Java implementieren.

ref:
https://www.kernel.org/doc/Documentation/mmc/mmc-dev-attrs.txt
https://www.kernel.org/doc/Documentation/sysfs-rules.txt
http://www.cameramemoryspeed.com/sd-memory-card-faq/reading-sd-card-cid-serial-psn-internal-numbers/

2
yurenchen

Ich suchte auch nach dieser Funktion, konnte aber niemals eine selbst gebraute Lösung finden. Am Ende fand ich eine Firma, die einen SID-Reader herstellt. Gehen Sie zu nexcopy.com und sehen Sie sich den Abschnitt SD- oder microSD-Duplikator an. Es können bis zu 20 Karten gleichzeitig gelesen werden.

2
Jesus

Obwohl die relativ alten Palm OS- und Windows Mobile OS-Geräte die SD-Karten-ID lesen können, können AFAIK Android-Geräte dies noch nicht. Dies ist besonders problematisch, da Probleme mit der Settings.Secure.Android_ID besprochen wurden hier .

1
gregS

Aufbauend auf Dineshs Antwort ...

Dinesh schlug vor, im Verzeichnis /sys/class/mmc_Host/mmc1/mmc1:*/wobei * eine Zahl ist) nach der Datei cid zu suchen, die den Inhalt des CID-Registers der Karte enthält. Dies funktioniert in vielen Fällen und ist ein sehr hilfreicher Anfang.

mmc1 ist jedoch nicht immer die austauschbare SD-Karte. Manchmal, z. Auf einem Motorola Droid Pro mit Android API Level 10 ist mmc0 die austauschbare SD-Karte, und mmc1 ist etwas anderes. Ich vermute, dass mmc1, falls vorhanden, auf irgendeinen internen Speicher verweist (möglicherweise eine nicht entfernbare microSD-Karte). Auf einem billigen Android-Tablet, das wir getestet haben, ist mmc0 die SD-Karte und es gibt keinen mmc1.

Sie können also nicht einfach davon ausgehen, dass mmc1 die SD-Karte ist.

Ein Hoffnungsschimmer: Es scheint (bis jetzt), dass wir durch Betrachten der Datei type im selben Verzeichnis wie die Datei cid (z. B. /sys/class/mmc_Host/mmc1/mmc1:0007/type) feststellen können, welcher Typ welcher ist: Ein Wert für SD gibt eine entfernbare SD-Karte an, während MMC ist nicht.

Das liegt jedoch nur am Testen auf einigen wenigen Android-Geräten. Ich kann keine Spezifikationen zum Inhalt der Datei type finden. Wenn also jemand anderes die relevante Dokumentation kennt, lassen Sie es mich bitte wissen.

Natürlich sind MMC und SD nur zwei verschiedene Speichertechnologiestandards, und SD ist abwärtskompatibel mit MMC. Es ist also nicht _ (der Fall, dass der Typ SD immer einer externen microSD-Karte entspricht. Es ist unwahrscheinlich, dass MMC eine microSD-Karte überhaupt anzeigen kann (wenn das Feld für den Typ korrekt ausgefüllt ist); Andererseits ist es denkbar, dass eine nicht entfernbare SD-Karte den Typ SD hat.

Weitere Informationen: Funktioniert dieser Ansatz, wenn eine microSD-Karte über einen USB-Adapter angeschlossen ist? Bei meinem einzigen Test mit einem Tablet wurde die über USB angeschlossene microSD-Karte als mmc1 mit dem Typ SD angezeigt.

0
LarsH