【发布时间】:2017-09-15 00:34:44
【问题描述】:
注意:这个问题是关于物理 SD 卡的序列号,而不是已安装的 volume 的 UUID。这是两个独立的数据。
在某些版本的 Android 和其他 Linux 变体中,可以获得已安装 SD 卡的序列号,例如通过阅读/sys/class/mmc_host/mmc0/mmc0:0001/serial 或/sys/block/mmcblk0/device/serial 的内容(具体数字可能会有所不同)。在我的测试中,只要将 SD 卡插入内置 SD 卡插槽(不是通过 USB 适配器安装),它就可以非常可靠地工作。
但从 Android 7.0 Nougat 开始,OS is said to be blocking access 到此信息,至少在某些设备上是这样。我通过在新的 Alcatel 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 卡的序列号?
如果没有,Google 是否有任何文档或其他声明说明提供或不提供此功能的计划?我在 Android issue tracker 中没有找到任何东西,但可能我搜索的不对。
为了确保问题清楚,我说的是在非 root 设备上运行的普通(非系统)应用程序可以做什么,以及应用程序通常可以请求和接收的任何权限。
仅供参考,/sbin 目录似乎不可读,所以像 /sbin/udevadm 这样的命令不是一个选项。
【问题讨论】:
-
我唯一能想到的就是
getUuid()onStorageVolume。您将从StorageManager获得StorageVolume对象。但是,我不知道 UUID 是否与序列号有关。 -
为了将来参考,这里是结果: 我测试它的设备给出的 UUID 为
76DE-3B41... 值得注意的是它只有 8 位数字。这是针对序列号为000fec46的芯片。当我们使用不同的芯片调用getUuid()时,音量 UUID没有改变。所以UUID肯定不是芯片序列号。 @Commonsware 感谢您的想法……这比我以前得到的信息更多。 -
@LarsH 我怀疑这些是 selinux 配置的变化,我在这里转发了你的问题:issuetracker.google.com/issues/37091475
-
@marcinj:仅供参考,我在issuetracker.google.com/issues/37705442 创建了一个单独的错误报告,以关注这个范围更窄的问题,从而希望避免打开这么多关于安全性的蠕虫。
-
@LarsH 我已经把它变成了一个答案,并将我找到的所有信息都放在上面。我还计划在您的错误报告中添加评论。
标签: android sd-card serial-number