我已经解决了这个问题,尽管它可能不适用于所有版本的 Android。我只在运行 MIUI v9、Android build 8.0.0 的 Mi6 上对其进行了测试。它需要根。
在研究了上面在我的问题中链接的 SO 解决方案后,我注意到代码正在检索特定电话功能的索引号,然后它将用于运行命令以关闭移动数据。使用它,我找到了一种真正关闭 SIM 卡的方法。
谷歌搜索由 Haotian Deng制作了这个页面,显示服务调用功能的这些索引列在 ITelephony.aidl 文件中。这些是 Java 代码获取的内容。这些都不适用于 Mi6,但链接到解释服务调用命令的此页面:
# service
Usage: service [-h|-?]
service list
service check SERVICE
service call SERVICE CODE [i32 INT | s16 STR] ...
Options:
i32: Write the integer INT into the send parcel.
s16: Write the UTF-16 string STR into the send parcel.
有了这个,我发现索引在设备的framework.jar中的com.android.internal.telephony.ITelephony中列出。
因此,要从您的设备中获取所需的索引,您需要从命令提示符运行以下命令:
- 从这里下载 jadx
- 亚行拉取设备framework.jar (adb pull /system/framework/framework.jar)
- 使用 7-Zip 打开 .jar 文件并提取 *.dex 文件。
- 使用 jadx-gui 打开每个 .dex 文件,直到找到具有以下树的文件:com.android.internal.telephony.ITelephony
- 搜索项目TRANSACTION_setSimPowerStateForSlot。注意后面的= x;这是索引号。
现在您有了索引号,您可以在 adb shell(或 Tasker,使用“运行 shell”功能)中测试以下命令。您需要在 shell 中“su”,或将 Tasker 设置为“Use Root”。
service call phone x i32 y i32 z
Where:
x = index number you fetched previously,
y = your subscription ID (generally, SIM1 = 0, SIM2 = 1)
z = whether on (1) or off (0)
当然,现在您可以在 Tasker 中执行它,您现在可以在特定时间关闭任一 SIM 卡。
我已经验证它确实关闭了 SIM 卡(在执行此命令后呼叫直接转到语音信箱),但我不确定此开关是否有任何进一步的影响。
享受!