1

我有一个支持两个 SIM 卡的小米 Mi6。我需要弄清楚如何在工作时间之外使用 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

这会打开SIM2的设置页面,就像这样。但是,我不知道如何打开或关闭 SIM 卡。

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

反编译的MultiSimInfoEditorActivity可以在这里找到。我还记录SIM 卡关闭再打开时发生的情况。

我非常感谢任何帮助!

4

1 回答 1

3

我已经解决了这个问题,尽管它可能不适用于所有版本的 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 卡(在执行此命令后呼叫直接转到语音信箱),但我不确定此开关是否有任何进一步的影响。

享受!

于 2018-02-12T03:36:36.130 回答