1

I want to get SDCard ID.

I am getting problem in Nougat(7.0) and above OS.

I already tried this,

     private String getExternalSdCARDId() {
        try {
            String exsdcard_path = "/sys/block/mmcblk1";
            File file = new File(exsdcard_path);
            String memBlk = null;
            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()));
            return br.readLine();
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

But this method returns NULL.

Nikhil PV
  • 1,014
  • 2
  • 16
  • 29
Dhruv Patel
  • 1,529
  • 1
  • 18
  • 27
  • Possible duplicate of https://stackoverflow.com/questions/43484564/how-can-i-retrieve-an-sd-cards-serial-number-in-android-7-0 ----- and says that - In Android N access to /sys nad /proc was significantly restricted, this was done to provide stricter sandboxes where applications run. – Arnold Brown Nov 30 '17 at 06:54

1 Answers1

4

try this :

String path2 = "/sys/block/mmcblk0/device";

BufferedReader serial;
BufferedReader name ;
BufferedReader manfid;
BufferedReader oemid;
BufferedReader mfDate;
BufferedReader CID;

        serial = new BufferedReader(new FileReader(path2 + "/serial"));
        name = new BufferedReader(new FileReader(path2 + "/name"));
        manfid = new BufferedReader(new FileReader(path2 + "/manfid"));
        oemid = new BufferedReader(new FileReader(path2 + "/oemid"));
        mfDate = new BufferedReader(new FileReader(path2 + "/date"));
        CID = new BufferedReader(new FileReader(path2 + "/cid"));

    String sdSerial = serial.readLine();
    String sdName = name.readLine();
    String sdMfId = manfid.readLine();
    String sdOemId = oemid.readLine();
    String sdMfDate = mfDate.readLine();
    String sdCid = CID.readLine();

or also use this

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++) {
        Log.d(TAG,"sid info "+sid[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 serial = new BufferedReader(new FileReader(cid_directory + "/serial"));
    BufferedReader name = new BufferedReader(new FileReader(cid_directory + "/name"));
    BufferedReader manfid = new BufferedReader(new FileReader(cid_directory + "/manfid"));
    BufferedReader oemid = new BufferedReader(new FileReader(cid_directory + "/oemid"));
    BufferedReader mfDate = new BufferedReader(new FileReader(cid_directory + "/date"));
    BufferedReader CID = new BufferedReader(new FileReader(cid_directory + "/cid"));


    String sdSerial = serial.readLine();
    String sdName = name.readLine();
    String sdMfId = manfid.readLine();
    String sdOemId = oemid.readLine();
    String sdMfDate = mfDate.readLine();
    String sdCid = CID.readLine();

//make sure before using this code check sdcard is present or not;

Above 7.0:Use StorageVolume.getUuid()on StorageVolume which you get from StorageManager.

The value is volume ID assigned during formatting of the card, and its length/format differs depending on file system type. For FAT32 it is XXXX-XXXX, for NTFS it's longer hex string, for Internal mass storage it returns null.