如何确定哪个SIM卡在双卡Android设备中收到短信

hai*_*zal 8 sms android telephonymanager

我正在开发一个项目,将Android手机中收到的短信同步到在线数据库.我可以通过调用getOriginatingAddress()方法获取发件人的号码.但我找不到任何解决方案来确定我的设备中的哪个SIM卡收到了短信.

我在网上搜索了它,但找不到解决这个问题的方法.有没有办法获得短信接收者的号码?

Lev*_*sök 15

我有一些非常困难的时间来解决这个问题,最后我找到了一个解决方案,尽管我只在api 22级以上测试过它.

您必须查看收到的意图中的额外信息.在我的情况下,意图的额外Bundle中有两个键是有用的:"slot"和"subscription".

这是一个例子:

public class IncomingSms extends BroadcastReceiver {

          public void onReceive(Context context, Intent intent) {

                // Retrieves a map of extended data from the intent.
                Bundle bundle = intent.getExtras();

                int slot = bundle.getInt("slot", -1);
                int sub = bundle.getInt("subscription", -1);

                /*
                  Handle the sim info
                */
            }
}
Run Code Online (Sandbox Code Playgroud)

我没有找到关于Bundle中的密钥的文档,所以这可能是设备/制造商的依赖,我可以想象密钥是不同的或类似的东西.您可以通过转储捆绑包的密钥集来验证这一点:

Set<string> keyset = bundle.keySet();
Run Code Online (Sandbox Code Playgroud)

编辑:

有关SIM卡电话号码的信息可能根本不可用,因为如果SIM卡未存储在SIM卡上,则可能无法查询,但所有其他信息都可通过SubscriptionManager获得:

SubscriptionManager manager = SubscriptionManager.from(appContext);
SubscriptionInfo = manager.getActiveSubscriptionInfo(sub);
Run Code Online (Sandbox Code Playgroud)

要么

SubscriptionInfo = manager.getActiveSubscriptionInfoForSimSlotIndex(slot);
Run Code Online (Sandbox Code Playgroud)

SubscriptionInfo中有一些有用的信息,例如电话号码,如上所述,我们不保证可以使用这些信息.

我也忘了提到,从api级别22添加了双重SIM支持库存android.