Отключение второй SIM-карты через оболочку adb /Tasker - с помощью действий / намерений

У меня есть Xiaomi Mi6, которая поддерживает две SIM-карты. Мне нужно выяснить, как я могу выключить вторую SIM-карту (SIM2) в нерабочее время с помощью Tasker.

Я понял, как открыть страницу настроек для SIM2 с помощью Tasker:

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 для SO, но я понятия не имею, работает ли оно или как его адаптировать к Tasker.

Декомпилированный MultiSimInfoEditorActivity можно найти здесь. Я также взял logcat того, что происходит, когда SIM-карта выключается и снова включается.

Я очень ценю любую помощь!

1 ответ

Решение

Я решил проблему, хотя она может не работать для всех версий Android. Я только протестировал его с моим Mi6 под управлением MIUI v9, Android build 8.0.0. Требуется рут.

После изучения решения SO, связанного выше в моем вопросе, я заметил, что код извлекает индексный номер конкретной функции телефонии, которую он затем использует для запуска команды для отключения мобильных данных. Используя это, я нашел способ фактически выключить SIM-карту.

Googling создал эту страницу от 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.

Вооружившись этим, я обнаружил, что индексы перечислены в com.android.internal.telephony.ITelephony в framework.jar устройств.

Итак, чтобы получить необходимый индекс из вашего устройства, вам нужно будет выполнить следующие команды из командной строки:

  • Скачать JADX отсюда
  • ADB вытащить устройства framework.jar (adb pull /system/framework/framework.jar)
  • Откройте файл.jar с помощью 7-Zip и извлеките файлы *.dex.
  • Открывайте каждый файл.dex с помощью jadx-gui, пока не найдете файл со следующим деревом: com.android.internal.telephony.ITelephony
  • Найдите элемент TRANSACTION_setSimPowerStateForSlot. Обратите внимание на = х после него; это номер индекса.

Теперь у вас есть индекс, который вы можете проверить следующей командой в adb shell (или Tasker, с функцией "run 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-карту (вызовы пересылаются прямо на голосовую почту сразу после выполнения этой команды), но я не уверен в дальнейших эффектах, которые оказывает этот переключатель.

Наслаждайтесь!

Другие вопросы по тегам