Отключение второй 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-карту (вызовы пересылаются прямо на голосовую почту сразу после выполнения этой команды), но я не уверен в дальнейших эффектах, которые оказывает этот переключатель.
Наслаждайтесь!