2017-04-19 49 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