Tasker Android SIM 双卡自动切换数据(dual sim card switch)

效果图

https://i.loli.net/2018/09/12/5b97fc5c31603.gif

2019-01-11 更新

  • 有网友提示小米测试无效, 正好把手上的小米8测试一下.

    • 设备信息 MIUI 10.3 by xiaomi.eu 9.1.3 开发版
    • 提取/system/framework/framework.jar 文件
    • 解压后得到classes.dex, classes2.dex, classes3.dex 文件, 使用dex2jar工具得到对应的JAR文件
    • 再使用jadx查看相应的TRANSACTION(com.android.internal.telephony.ITelephony) 数字
  • 得到信息如下:

    • 在com.android.internal.telephony.ISub 中找到static final int TRANSACTION_setDefaultDataSubId = 24
    • 在com.android.internal.telephony.ITelephony 中找到static final int TRANSACTION_setSimPowerStateForSlot = 176
  • 经测试结果如下:
    设置默认数据命令: service call isub 24 i32 i 确实无效. 设置SIM卡状态命令service call phone 176 i32 x i32 y 还是可以正常执行的.

  • 猜测

    • 新的系统应该是和Redmi Note 3 Pro 系统有很大差别, 现在小米8已经支持双4G, 自从换手机之后, 我也没再使用Tasker 切换数据流量了.
    • 这个问题目前我也不知道怎么解决. 对深入内容也不是很了解, 希望技术大牛能解决.

引用

http://ktnr74.blogspot.com/2014/09/calling-android-services-from-adb-shell.html
https://tasker.joaoapps.com/userguide/zh/
https://forum.xda-developers.com/mi-6/how-to/guide-switch-off-individual-sims-tasker-t3748205
https://stackoverflow.com/questions/20227326/where-to-find-info-on-androids-service-call-shell-command
https://gwokshingcheung.blogspot.com/2017/08/taskerwifissr.html

背景

最近买了物联网卡(卡2), 只作为上网使用, 接电话发短信还是使用联通主卡(卡1). 手机虽然双卡双待,
但是只能一个卡设置为4G, 正常情况下, 把卡2设置为4G用来上网, 卡1自动设置为2G/3G接打电话.
由于出租屋内2G/3G基本没信息号, 每次回到住的地方都需要手动把卡1设置主卡(4G). 然后每次出门后再把卡2设置主卡.
大多数都忘记设置, 电话短信也接不到, 这两天有时间研究了一下 Tasker, 实现根据某些条自动切换双卡数据流量.

目标

根据连接到特定的WIFI(住处)来实现双SIM卡数据流量的自动切换, 本文主要目的就是得到下面二行命令:

service call isub 24 i32 1   #24是我们要通过下面步骤查找出来的, 不同的手机数字是不同的, 需要自已查找
service call isub 24 i32 2

工具

步骤

  • 手机必需ROOT
  • 使用ADB从手机拷贝出来 /system/framework/arm64/boot-framework.vdex(Anroid Oreo)
  • 使用vdexExtractor提取出dex文件
  • 再使用jadx查看相应的TRANSACTION(com.android.internal.telephony.ITelephony) 数字

Android service call 命令行格式

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

教程实践

根据教程我找到了现应的TRANSACTION_setSimPowerStateForSlot = 164

static final int TRANSACTION_setSimPowerStateForSlot = 164;

public void setSimPowerStateForSlot(int slotIndex, int state) throws RemoteException {
    Parcel _data = Parcel.obtain();
    Parcel _reply = Parcel.obtain();
    try {
        _data.writeInterfaceToken(Stub.DESCRIPTOR);
        _data.writeInt(slotIndex);
        _data.writeInt(state);
        this.mRemote.transact(164, _data, _reply, 0);
        _reply.readException();
    } finally {
        _reply.recycle();
        _data.recycle();
    }
}

截图:
https://i.loli.net/2018/09/12/5b97ef208ebc1.png

命令行解释:

service call phone 164 i32 x i32 y
  • phone 指的是服务(com.android.internal.telephony.ITelephony)
  • 164 指的是setSimPowerStateForSlot 方法
  • x y分别是该方法的两个参数, x代表卡槽(索引从0开始) , y代表状态(0代表关闭, 1代表打开)

把卡1关闭

service call phone 164 i32 0 i32 0

把卡2打开

service call phone 164 i32 1 i32 1

通过运行上面命令确实可以打开或关闭SIM, 但这不是我想要的,

探索

我接着又尝试了许多其它方法(数字), 都没有成功,

static final int TRANSACTION_setDataEnabled = 106;  //禁用启用数据流量的
static final int TRANSACTION_setPreferredNetworkType = 105;  //设置首先网络的
static final int TRANSACTION_setDataActivationState = 60; 
.....

然后开始查看其它服务:ISms, IMms,..., 当我看到ISub中的static final int TRANSACTION_setDefaultDataSubId = 24;时, 感觉就是它了,
字面意思就是: 设置默认数据流量, 和手机上设置名称相对应, 不过直接测试并没有效果, (可能其它尝试把系统变量改乱了, 重启后可以了),
又查询了subId参数(并没有查到), 不过多次测试知道了: 卡1 为 1, 卡2 为2, 索引从1开始,(并不保证正确, 仅测试得出, 如果错误请指出)

public void setDefaultDataSubId(int subId) throws RemoteException {
    Parcel _data = Parcel.obtain();
    Parcel _reply = Parcel.obtain();
    try {
        _data.writeInterfaceToken(Stub.DESCRIPTOR);
        _data.writeInt(subId);
        this.mRemote.transact(24, _data, _reply, 0);
        _reply.readException();
    } finally {
        _reply.recycle();
        _data.recycle();
    }
}

最终得到如下命令:

service call isub 24 i32 x
  • isub 指的是服务(com.android.internal.telephony.ISub)
  • 24 指的是setDefaultDataSubId 方法
  • x 指的是subId参数, (1代表卡1, 2代表卡2)

把卡1 设置为默认数据卡:

service call isub 24 i32 1

把卡2 设置为默认数据卡:

service call isub 24 i32 2

Tasker

Tasker功能很强大, 网上资料也很多, 不清楚的大家自己GOOGLE
参考设置 : https://gwokshingcheung.blogspot.com/2017/08/taskerwifissr.html

总结

关于这方面的资料不是很多, 查了一下中文的很少, 英文资料有一些, 最终结果却不我想要的.
在经过多次尝试后,并成功了, 感觉很棒, 哈哈., (^_~
记录此文, 分享给那些也在尝试这方面知识的同学...

评论

匿名

miui 10 9.1.2 开发版,MIX2,测试无效。

按教程查出来,setDefaultDataSubId 是21。

service call isub 21 i32 1/2 都无效。唉。

system
回复 @匿名

感谢提醒, 已测试最新系统, 确实无效, 已更新Blog.

Viagle Blog

欢迎来到我的个人博客网站