在一些Android版本和其他Linux变体中,可以获取已挂载SD卡的序列号,例如通过读取/sys/class/mmc_host/mmc0/mmc0:0001/serial或/sys/block/mmcblk0/device/serial(具体数字可能会有所变化)。在我的测试中,只要SD卡插入内置SD卡插槽中(而不是通过USB适配器挂载),这种方法就相当可靠。
但是截至Android 7.0 Nougat,据说操作系统正在阻止访问此信息,至少在某些设备上是如此。我通过在新的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卡的序列号?
如果没有,那么谷歌有没有提供或不提供此功能的计划文件或其他声明?我在Android 问题跟踪器中没有找到任何信息,但可能是因为我的搜索方式不正确。
为了确保问题清晰,我说的是一个普通(非系统)应用程序在非root设备上运行时可以做什么,具有应用程序通常可以请求和接收的任何权限。
FYI,
/sbin
目录似乎不可读,因此像/sbin/udevadm
这样的命令不是一个选项。
StorageVolume
上的getUuid()
。你可以从StorageManager
获取StorageVolume
对象。然而,我不知道UUID是否与序列号有关。 - CommonsWare