使用具有多SIM卡设备的多个TelephonyManagers

时间:2017-11-24 14:32:12

标签: android telephonymanager

我试图建立一个multisim Android设备(运行Android 7.0+)有任何工作/启用的SIM卡。 为此,我按照谷歌关于将多个TelephonyManagers附加到默认TelephonyManager实例的文档,按照:https://developer.android.com/reference/android/telephony/TelephonyManager.html#SIM_STATE_READY

  

返回的TelephonyManager将使用默认订阅   所有通话。要为特定订阅调用API,请使用   createForSubscriptionId(INT)。例如telephonyManager =   defaultSubTelephonyManager.createForSubscriptionId(子ID);

在我的具体情况下是这样的:

 telephonyManager = (TelephonyManager) mContext
                   .getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_SERVICE_STATE);


List subList = mSubManager.getActiveSubscriptionInfoList();
        SubscriptionInfo firstSub = (SubscriptionInfo) subList.get(0);
    mSim0TelephonyManager = telephonyManager.createForSubscriptionId(firstSub.getSubscriptionId());
    mSim0TelephonyManager.listen(new Sim0PhoneStateListener(), PhoneStateListener.LISTEN_SERVICE_STATE);
    int test = mSim0TelephonyManager.getSimState();

SubscriptionInfo secondSub = (SubscriptionInfo) subList.get(1);
 mSim1TelephonyManager = telephonyManager.createForSubscriptionId(secondSub.getSubscriptionId());
mSim1TelephonyManager.listen(new Sim1PhoneStateListener(), PhoneStateListener.LISTEN_SERVICE_STATE);
 int testw = mSim1TelephonyManager.getSimState();

所以首先我得到所有活跃的订阅,这已经很痛苦,因为实际上那些不是有效订阅,就像订阅服务中的状态一样,那些只是插入SIM卡插槽的SIM卡。

这意味着即使您使用Android设置菜单停用SIM卡,您仍会收到该SIM卡作为有效订阅!!!!

下一个问题是,即使停用(无服务!!!)SIM卡,我的值为5(https://developer.android.com/reference/android/telephony/TelephonyManager.html#SIM_STATE_READY)。对我来说,这是不可理解的,SIM状态准备就绪,同时整个SIM卡被停用。这意味着那些API调用根本不可靠......

此外,在将PhoneStateListeners添加到各个新的TelephonyManagers后,当通过Android设置菜单激活/停用SIM卡时,我没有得到任何调用这些PhoneStateListener的实现...

现在我想知道Android内部是否有问题,或者设备制造商实施(在三星A5 2017 Duo和华为P9 Lite上测试)。不幸的是,模拟器不支持多SIM卡,所以我无法测试普通的Android Nougat版本:(

更新:

与此同时,我发现了这个主题:How to get a PhoneStateListener when using Dual SIM functionality

在listen(PhoneStateListener listener,int events)中,Google的实现中实际上存在一个错误,导致PhoneStateListener仅为默认的SubscriptionId实例化,而与构造函数中传递的参数无关。 ....

1 个答案:

答案 0 :(得分:0)

我没有尝试,但是它可能对您有用

subids[] = SubscriptionManager.getSubscriptionId()
if (SubscriptionManager.isActiveSubscriptionId(subids[0])){
    mSim0TelephonyManager = telephonyManager.createForSubscriptionId(firstSub.getSubscriptionId());
}

这将起作用