在某些版本的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)
Run Code Online (Sandbox Code Playgroud)
为了将来参考,我们(从adb shell测试)具有ls -ld
以下权限:
/sys/class/mmc_host
但不是 /sys/class/mmc_host/mmc0
/sys/block
但不是 /sys/block/mmcblk0
由于上述方法不再有效,
有没有其他方法可以获得Android 7.0或更高版本中安装的SD卡的序列号?
如果不这样做,谷歌是否有关于提供或不提供此功能的计划的任何文件或其他声明?我没有在Android 问题跟踪器中找到任何内容,但也许我没有找到正确的搜索引擎.
为了确保问题清楚,我正在谈论在非根设备上运行的普通(非系统)应用程序可以做什么,以及应用程序通常可以请求和接收的任何权限.
仅供参考,该/sbin
目录似乎不可读,因此命令/sbin/udevadm
不是一个选项.
是否有可能找到插入Android设备的SD卡的卷标?
据我所知,Android设计只有一个"外部存储"(如返回Environment.getExternalStorageDirectory()
),但有很多设备在内部将内部闪存作为"外部存储",并在其下安装SD卡或甚至更复杂的组合(见另一个问题).可以通过阅读来枚举这些附加设备/proc/mounts
,但我们需要一些东西来识别用户.有没有机会获得他们的卷标?
我检查了Linux vfat驱动程序完全忽略了卷标签dentry,而且blkid
从util-linux 读取了vfat本身.我还检查过,至少在我的设备上,SD卡的块设备有模式660
和所有者root.root
,所以我不能这样做.所以基本上它归结为是否有任何可以读取它的实用程序.
我在尝试获取SD卡ID时面临服务onCreate()的问题.使用来自src-external/android-core的android.os包的FileUtils类.
mCardId = FileUtils.getFatVolumeId(Environment.getExternalStorageDirectory().getPath());
崩溃日志:
12-31 19:55:25.804: E/AndroidRuntime(1235): java.lang.NoSuchMethodError: android.os.FileUtils.getFatVolumeId 12-31 19:55:25.804: E/AndroidRuntime(1235): at cloudtv.android.cs.service.MediaPlaybackService.onCreate(MediaPlaybackService.java:198) 12-31 19:55:25.804: E/AndroidRuntime(1235): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2572) 12-31 19:55:25.804: E/AndroidRuntime(1235): at android.app.ActivityThread.access$1800(ActivityThread.java:135) 12-31 19:55:25.804: E/AndroidRuntime(1235): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 12-31 19:55:25.804: E/AndroidRuntime(1235): at android.os.Handler.dispatchMessage(Handler.java:102) 12-31 19:55:25.804: E/AndroidRuntime(1235): at android.os.Looper.loop(Looper.java:136) 12-31 19:55:25.804: E/AndroidRuntime(1235): at android.app.ActivityThread.main(ActivityThread.java:5017) 12-31 19:55:25.804: E/AndroidRuntime(1235): at java.lang.reflect.Method.invokeNative(Native Method) 12-31 19:55:25.804: E/AndroidRuntime(1235): at java.lang.reflect.Method.invoke(Method.java:515) 12-31 19:55:25.804: E/AndroidRuntime(1235): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 12-31 19:55:25.804: E/AndroidRuntime(1235): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 12-31 19:55:25.804: E/AndroidRuntime(1235): at dalvik.system.NativeStart.main(Native Method)
提前致谢!