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

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

但就Android 7.0牛轧糖而言, 据说操作系统至less在某些设备上阻止访问这些信息。 我通过在新的阿尔卡特A30 GSM(Android 7.0)上运行一个testing应用程序来testing这个,实际上上面的方法失败并带有许可错误:

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

为了将来的参考,我们(从一个adbshelltesting)有权限ls -ld以下内容:

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

由于上述方法不再有效,

  • 有没有另外一种方法来获得在Android 7.0或更高版本安装的SD卡的序列号?

  • 如果没有,Google是否提供了有关提供或不提供此function的计划的文档或其他声明? 我在Android 问题跟踪器中没有find任何东西,但也许我没有正确的search。

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

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

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

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

如果/ sys中有特定的文件,您认为这些文件应该可以被应用程序使用,但是没有,请提交一个新的错误,以便对请求进行评估。 例如,/ sys / devices / system / cpu可用于所有进程,所以说/ sys受到限制是不准确的。

我有一个不好的感觉,谷歌正在进行类似于苹果的变化,它不允许获得硬件ID。 如果没有解决,那么解决scheme是使用谷歌帐户ID。 但是我意识到这并不总是可能的,并且需要业务逻辑(许可等)的重大改变。

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

另一个相关的SO我发现: 在Android的牛轧糖文件系统的变化

使用从StorageManager获取的StorageVolume上的StorageVolume.getUuid() 。

该值是在格式化卡时分配的卷ID,其长度/格式因文件系统types而异。 对于FAT32,它是XXXX-XXXX,对于NTFS,它是较长的hexstring,对于内部大容量存储,它返回空值。

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

你也可以试试

sudo hwinfo --disk

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

也试试

sudo hdparm -I /dev/sdb | more