如何在Android 7.0+中检索SD卡的序列号?

在某些版本的Android和其他Linux版本中,可以获取已安装SD卡的序列号,例如通过读取/sys/class/mmc_host/mmc0/mmc0:0001/serial/sys/block/mmcblk0/device/serial (具体数字可能有所不同)。 在我的测试中,只要将SD卡插入内置SD卡插槽(不通过USB适配器安装),这就非常可靠。

但是从Android 7.0 Nougat开始, 据说操作系统阻止访问这些信息,至少在某些设备上是这样。 我通过在新的阿尔卡特A30 GSM(Android 7.0)上运行测试应用程序对此进行了测试,实际上上述方法失败并出现权限错误:

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

为了将来参考,我们(从adb shell测试)拥有ls -ld以下权限:

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

由于上述方法不再有效,

  • 有没有其他方法可以获得Android 7.0或更高版本中安装的SD卡的序列号?

  • 如果不这样做,谷歌是否有关于提供或不提供此function的计划的任何文件或其他声明? 我没有在Android 问题跟踪器中find任何内容,但也许我没有find正确的搜索引擎。

为了确保问题清楚,我正在谈论在非根设备上运行的普通(非系统)应用程序可以做什么,以及应用程序通常可以请求和接收的任何权限。

仅供参考, /sbin目录似乎不可读,因此像/sbin/udevadm这样的命令不是一个选项。

Solutions Collecting From Web of "如何在Android 7.0+中检索SD卡的序列号?"

在Android N中,对/ sys nad / proc的访问受到严格限制,这样做是为了提供应用程序运行的更严格的沙箱。 这在https://issuetracker.google.com/issues/37091475中有意解释。 实际上并没有说/ sys中的所有数据都无法访问,并且谷歌开放允许从这个位置访问其他文件:

如果/ sys中存在特定文件,您认为应该可以提供给应用程序,但不是,请提交新的错误,以便评估请求。 例如,/ sys / devices / system / cpu可用于所有进程,因此说/ sys受限制是不准确的。

我有一种不好的感觉,谷歌正在进行类似于苹果的改变,不允许获得硬件ID。 如果没有解决,那么解决方案是使用谷歌帐户ID。 但我知道这并不总是可行的,并且需要对业务逻辑进行重大更改(许可等)。

希望您的错误报告将被认为是积极的。

另一个相关的SO我发现: Android Nougat中的文件系统更改

在StorageVolume上使用StorageVolume.getUuid() ,它来自StorageManager。

该值是在格式化卡期间分配的卷ID,其长度/格式因文件系统types而异。 对于FAT32,它是XXXX-XXXX,对于NTFS,它是更长的hex字符串,对于内部大容量存储,它返回null。

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

你也可以试试

sudo hwinfo --disk

获取有关磁盘的信息,包括SD卡。

也试试

sudo hdparm -I /dev/sdb | more