通过 adb shell/Tasker 关闭第二张 SIM - 使用 activities/intents

Turning off second SIM via adb shell/Tasker - using activities/intents

我有一台小米6,支持两卡。我需要弄清楚如何在工作时间以外使用 Tasker 关闭第二张 SIM (SIM2)。

我已经弄清楚如何使用 Tasker 打开 SIM2 的设置页面:

Action: android.intent.action.MAIN
Cat: Launcher
Extra 1: subscription_id:1
Extra 2: slot_id:1
Package: com.android.phone
Class: com.android.phone.settings.MultiSimInfoEditorActivity
Target: Activity

这会显示 settings page for SIM2, like so. 但是,我不知道如何打开或关闭 SIM 卡。

为了找到有用的东西,我反编译了 com.android.phone (TeleService.apk) 但因为我不知道 Java 我不知道从这里去哪里。我知道 SO here 上已经有一个 Java 解决方案,但我不知道它是否有效或如何使其适应 Tasker。

反编译的 MultiSimInfoEditorActivity 可以找到 here. I have also taken a logcat SIM 关闭并再次打开时发生的情况。

非常感谢任何帮助!

我已经解决了这个问题,尽管它可能不适用于 Android 的所有版本。我只用我的 Mi6 运行ning MIUI v9,Android build 8.0.0 测试过它。 需要root权限。

研究 SO solution linked above in my question 后,我注意到该代码正在检索特定电话功能的索引号,然后它将用于 运行 关闭移动数据的命令。使用它,我找到了一种实际关闭 SIM 卡的方法。

谷歌搜索产生 this page from Haotian Deng that showed these indexes for the service call function were listed inside the ITelephony.aidl file. These are what were being fetched by the Java code . None of these worked for the Mi6, but linked to this page 解释了 服务调用 命令:

# 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 中.

因此,要从您的设备中获取所需的索引,您需要 运行 在命令提示符下执行以下命令:

  • here
  • 下载 jadx
  • ADB 拉设备 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,使用 "run 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 卡(执行此命令后呼叫会直接转到语音信箱)但我不确定此开关是否有任何进一步的影响。

尽情享受吧!