2017-04-19 48 views
23

在某些Android版本和其他Linux版本中,可以獲得安裝的SD卡的序列號,例如,通過閱讀/sys/class/mmc_host/mmc0/mmc0:0001/serial/sys/block/mmcblk0/device/serial的內容(具體數字可能會有所不同)。在我的測試中,只要將SD卡插入內置SD卡插槽(未通過USB適配器安裝),就可以非常可靠地工作。如何在Android 7.0+中檢索SD卡的序列號?

但是至於Android 7.0 Nougat,OS is said to be blocking access這個信息,至少在某些設備上。我測試了運行在一個新的阿爾卡特A30 GSM(安卓7.0)一個測試應用程序,而實際上上述方法未能權限錯誤:

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

對於未來的參考,我們(從亞行外殼測試)有權ls -ld如下:

  • /sys/class/mmc_host但不/sys/class/mmc_host/mmc0
  • /sys/block但不/sys/block/mmcblk0

由於上述方法不再起作用,

  • 有另一種方式獲得的Android 7.0或更高版本的安裝SD卡的序列號?

  • 如果沒有,Google是否有任何文檔或其他聲明提供或不提供此功能?我在Android issue tracker中沒有找到任何東西,但也許我找不到。

要確保問題是清楚的,我說的是什麼一個無根的設備上運行的普通(非系統)的應用程序可以做的,與任何權限的應用程序可以正常地請求和接收。

僅供參考,/sbin目錄似乎不可讀,所以不能選擇像/sbin/udevadm這樣的命令。

+1

,我能想到的唯一的事情就是在球場是['getUuid()''上StorageVolume'(https://developer.android.com/參考/機器人/ OS /存儲/ StorageVolume.html#getUuid())。您將從'StorageManager'獲得'StorageVolume'對象。但是,我不知道UUID是否與序列號有關。 – CommonsWare

+0

@CommonsWare:謝謝,我會試試看。我已經閱讀過,卷ID與芯片的序列號無關,但不知道Android上是否屬實。如果'getUuid()'真的返回一個UUID,那麼它不能完全是芯片序列號,因爲後者只有32位。但如果它是基於芯片序列號的可預測數字,那就沒問題。 – LarsH

+0

我沒有更好的選擇給你 - 對不起! – CommonsWare

回答

1

在您從StorageManager獲取的StorageVolume上使用StorageVolume.getUuid()

該值是在格式化卡時分配的卷ID,其長度/格式因文件系統類型而異。對於FAT32,它是XXXX-XXXX,對於NTFS,它是較長的十六進制字符串,對於內部大容量存儲器,它返回空值。

+0

感謝您的想法。這是一樣的CommonsWare的評論,看到我在http://stackoverflow.com/questions/43484564/how-can-i-retrieve-an-sd-cards-serial-number-in-android-7-0/響應43552675#comment74112562_43484564 – LarsH

4

在Android N中,對/ sys nad/proc的訪問受到顯着限制,這是爲了在應用程序運行時提供更嚴格的沙箱。這在https://issuetracker.google.com/issues/37091475中解釋爲故意。其實它不是說,在/ SYS所有的數據是無法訪問的,而谷歌是開放的,允許從該位置訪問其他文件:

If there are specific files in /sys you believe should be available to applications, but are not, please file a new bug where the request can be evaluated. For instance, /sys/devices/system/cpu is available to all processes, so it's inaccurate to say all of /sys is restricted.

我有一種不好的預感,谷歌推出了類似蘋果那裏的變化不允許獲得硬件ID。如果沒有解決,那麼解決方案就是使用Google帳戶ID。但我知道這並非總是可能,並且需要對業務邏輯(授權等)進行重大更改。

希望你的bug report將被視爲積極。

另一個相關的SO,我發現:File system changes in Android Nougat

+0

T爲了您對該錯誤報告的評論:你說了什麼需要說。 – LarsH

+0

你能告訴我你在哪些Android 7設備上看到過這個問題?我唯一可以訪問的Nougat設備是上面提到的阿爾卡特A30,我想知道這個問題有多廣泛。 – LarsH

+1

我們目前只在索尼Z5上看到過這一點。 – marcinj

0

adb shell cat /sys/class/mmc_host/mmc1/mmc1:*/cid

您也可以嘗試

sudo hwinfo --disk

得到您的磁盤的信息,包括SD卡。

也可以嘗試

sudo hdparm -I /dev/sdb | more

+0

第一個建議就像問題中提到的那樣不工作,但使用'cid'而不是'serial'。它遭受同樣的問題:'/ sys/class/mmc_host/mmc *'不可讀。我會盡可能地嘗試其他兩種關於Android 7.0的建議,但是當我在6.0的adb shell下嘗試它們時,沒有找到「sudo」,「hwinfo」或「hdparm」。 – LarsH

+0

我在Android 7.0設備上嘗試了最後兩條建議,並得到了相同的結果 - 沒有找到「sudo」,「hwinfo」或「hdparm」。 – LarsH