android - 在 Android 12 上通过 ADB 读取 IMSI 信息
问题描述
我最近将我的 Pixel 5 设备更新为 Android 12 Beta,发现无法再使用以下命令通过 ADB 获取 IMSI 信息service call iphonesubinfo 8 i32 1
现在通过 ADB 执行时显示以下信息:
redfin:/ $ service call iphonesubinfo 8 i32 1
Result: Parcel(
0x00000000: ffffffff 00000042 00650067 00530074 '....B...g.e.t.S.'
0x00000010: 00620075 00630073 00690072 00650062 'u.b.s.c.r.i.b.e.'
0x00000020: 00490072 00460064 0072006f 00750053 'r.I.d.F.o.r.S.u.'
0x00000030: 00730062 00720063 00620069 00720065 'b.s.c.r.i.b.e.r.'
0x00000040: 0020003a 00610050 006b0063 00670061 ':. .P.a.c.k.a.g.'
0x00000050: 00200065 0075006e 006c006c 00640020 'e. .n.u.l.l. .d.'
0x00000060: 0065006f 00200073 006f006e 00200074 'o.e.s. .n.o.t. .'
0x00000070: 00650062 006f006c 0067006e 00740020 'b.e.l.o.n.g. .t.'
0x00000080: 0020006f 00300032 00300030 00000000 'o. .2.0.0.0.....'
0x00000090: 00000000 '.... ')
在相同的 Pixel 5 上运行上述命令,但安装了最新的 Android 11 版本,它将以与上述相同的格式向我显示 IMSI,因此很明显这与硬件无关,而是对用户安全层的更新在安卓 12 上。
我没有用 root 测试过,因为在运行 Android 10-11 的任何设备上都不需要这样做。
据我所知,这是在较新设备上读取 IMSI 信息的唯一方法,因为READ_PHONE_STATE
权限已更改并且读取 IMSI 信息的能力已移至READ_PRIVILEGED_PHONE_STATE
权限;仅适用于系统和供应商应用程序。
这是一个失败的原因,还是有任何其他一致的方式可以在较新的 Android 设备上读取 IMSI 信息?
解决方案
如果您的apk的targetsdk <30,您可以通过以下方法获取IMSI,无需在android 11中获得任何许可。
Uri uri = Uri.parse("content://telephony/siminfo");
Cursor cursor = null;
ContentResolver contentResolver = getApplicationContext().getContentResolver();
cursor = contentResolver.query(uri,
new String[]{"_id", "sim_id", "imsi","icc_id","number","display_name"}, "0=0",
new String[]{}, null);
if (null != cursor) {
while (cursor.moveToNext()) {
String icc_id = cursor.getString(cursor.getColumnIndex("icc_id"));
String imsi_id = cursor.getString(cursor.getColumnIndex("imsi"));
String phone_num = cursor.getString(cursor.getColumnIndex("number"));
String display_name = cursor.getString(cursor.getColumnIndex("display_name"));
int sim_id = cursor.getInt(cursor.getColumnIndex("sim_id"));
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
Log.d("Q_M", "icc_id-->" + icc_id);
Log.d("Q_M", "imsi_id-->" + imsi_id);
Log.d("Q_M", "phone_num-->" + phone_num);
Log.d("Q_M", "sim_id-->" + sim_id);
Log.d("Q_M", "display_name-->" + display_name);
}
}
推荐阅读
- app-store - 上传我的应用程序时出错:App Sore Connect 操作错误
- android - 不同设备的布局 - 约束布局和最小宽度限定符
- php - 如何通过 curl post 将文件上传到 api
- javascript - 可能未处理的拒绝:-尝试将数据从 angularJS 传递到 spring MVC
- angular - 如何从动态传递的数据中选择复选框?
- linux - 在makefile中,如果文件不存在则创建一个空文件
- vuejs2 - 如何在 Vue.js webapp 中使用 dygraphs?
- for-loop - 如何在 bash 中更正 awk 命令中的“for 语句”
- python - 在父进程和子进程之间使用管道
- telegram-bot - 是否可以使用 Telegram API 固定消息?