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
*/
}
}
if (bundle != null) {
int slot = -1;
Set<String> keySet = bundle.keySet();
for(String key:keySet){
if(key.equals("phone")){slot = bundle.getInt("phone", -1);}//in api 29
else if(key.equals("slot")){slot = bundle.getInt("slot", -1);}
else if(key.equals("slotId")){slot = bundle.getInt("slotId", -1);}
else if(key.equals("slot_id")){slot = bundle.getInt("slot_id", -1);}
else if(key.equals("slotIdx")){slot = bundle.getInt("slotIdx", -1);}
else if(key.equals("simId")){slot = bundle.getInt("simId", -1);}
else if(key.equals("simSlot")){slot = bundle.getInt("simSlot", -1);}
else if(key.equals("simnum")){slot = bundle.getInt("simnum", -1);}
}
System.out.println(" The sim no is >>> "+slot);
//or get subscription and do next
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
int sub = bundle.getInt("subscription", -1);
SubscriptionManager manager = SubscriptionManager.from(context);
SubscriptionInfo subnfo = manager.getActiveSubscriptionInfo(sub);//this requires READ_PHONE_STATE permission
System.out.println(
"\n The sim no is >>> "+subnfo.getSimSlotIndex()
//or subnfo.getCardId()
+"\n The sim no is >>> "+subnfo.getCardId()//this requires api 29 and +++
//some infos may you need it
+"\n Phone No is >>> "+subnfo.getNumber()//not guaranteed to be available
+"\n carrier Name is >>> "+subnfo.getCarrierName()//the operator name
+"\n carrier display Name is >>> "+subnfo.getDisplayName()//that you typed in dual sim settings
);
}
}
8条答案
按热度按时间d6kp6zgx1#
我有一些真的很难与这个问题,最后我找到了一个解决方案,虽然我测试它只高于api级22。
您必须查看接收到的Intent中的额外信息。在我的例子中,Intent的额外Bundle中有两个键非常有用:“插槽”和“订阅”。
下面是一个示例:
我没有找到关于捆绑包中密钥的文档,因此这可能与设备/制造商有关,我可以想象密钥是不同的或类似的。您可以通过转储捆绑包的密钥集来验证这一点:
编辑:
有关SIM卡电话号码的信息可能根本不可用,因为如果它没有存储在SIM卡上,则很可能无法查询,但所有其他信息将通过SubscriptionManager提供:
或
而且在SubscriptionInfo中有一些有用的信息,比如电话号码,正如我上面解释的,哪一个不能保证可用。
我还忘了提一下,股票Android中的双SIM卡支持是从API级别22添加的。
ckocjqey2#
我使用了Levente Püsök的答案,做了一点改动。但是我没有在所有设备上测试。
zysjyyx43#
通过将答案和更新相结合,我取得了非常好的结果
ccgok5k54#
这个对我很好用,试试可能会对你有帮助
tktrz96b5#
在Kotlin中,使用SubscriptionManager额外字符串:
要调用
smsReceiver
,您需要向用户请求运行时“android.permission.RECEIVE_SMS”权限。要访问订阅列表,还需要READ_PHONE_STATE和READ_PHONE_NUMBERS(仅适用于Android 12及更高版本)。在Android 10、11和12(三星、Pixel和小米设备)上进行了测试。
fjaof16o6#
mahmood-karimizade解决方案非常好,它对我很有帮助。但是我发现了一些额外的密钥,它们也可以包含sim卡插槽值,这是在我的Google Pixel 4a上(Android 13)所以我认为它会成为主流。键
android.telephony.extra.SLOT_INDEX
也包含sim插槽索引。另一件事是sim插槽索引似乎总是int值,因此我还更新了switch
表达式中的default
条件,以使用bundle.getInt
函数而不是bundle.getString
pcrecxhr7#
Kotlin溶液
此代码不显示任何警告
7eumitmz8#
SMS具有thread_id字段,可能对于参与者集合是唯一的。可能对于同一发送者和两个西姆斯是不同的,并且至少有助于区分。