小结:刚开始觉得短信发送很简单啊,不就是这样这样,再那样一下就好了嘛。但其实内容听繁琐的。坑不多,但需要判断的东西挺多。
首先需要判断有无SIM卡
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
String simState = tm.getSubscriberId();
if (TextUtils.isEmpty(simState)) {
Toast.makeText(MobileVerifed.this, "未检测到Sim卡", Toast.LENGTH_SHORT).show();
return;
}
其实这个getSubscriberId在后面也会用到。如果有卡的话,会获得到运营商的IMSI
判断是否双卡【选择哪一个卡去发送短信】
List<Integer> idList=new ArrayList<Integer>();
SubscriptionManager subscriptionManager = SubscriptionManager.from(MobileVerifed.this);
List<SubscriptionInfo> infoList = subscriptionManager.getActiveSubscriptionInfoList();
for (SubscriptionInfo info : infoList) {
idList.add(info.getSubscriptionId());
}
SmsManager.getSmsManagerForSubscriptionId(idList.get(0))
.sendTextMessage("目的电话号码",null,"短信消息",null,null);
SmsManager.getSmsManagerForSubscriptionId(idList.get(1))
.sendTextMessage("目的电话号码",null,"短信消息",null,null);
我的手机是双卡,可以看到infoList 值为:
idList值为:
其中如果选择一个变量区分两个手机卡,应选择,iccid。每个sim卡都有自己的iccid。
ps. SubscriptionManager 是谷歌官方5.0以上正式支持双卡双待,所以会有相关类。以前是各大厂商自己加的。如果试图兼容5.0以下必须用反射,而且必须考虑运营商的不同。
判断是否开通了发送短信权限【询问、允许】
这儿有点复杂,和兼容性相关
有人会问,检测这个权限干什么呀。检测权限的主要目的是为了告诉用户去开通,或者提示用户不是软件卡了,是你没开通。
6.0以下,一般在初始的时候就会把权限就要到,所以不需要查看是否开通了发送短信权限。但如果查询的话,也有一个兼容方法 ContextCompat.checkSelfPermission()
但6.0以下也存在一些系统,比如我试的这台魅蓝2,使用的是YunOS系统,盗版的Android系统,haha,可以使用动态权限。但用户在设置中禁止后,上面检测的方法检测不到权限是否开通。也就是用户点击了之后,就没反应了,体验不好