Android短信发送:考虑动态权限和兼容性问题

本文详细介绍了在Android开发中实现短信发送时遇到的挑战,包括检查SIM卡、处理双卡选择、检测和请求短信权限、兼容不同Android版本以及处理用户权限设置。特别讨论了在6.0以上版本中如何正确检测权限,并提供了处理用户不再提醒的策略。此外,还涉及到广播接收器的注册和解绑,以及处理无话费情况和跳转到权限设置页面的特殊情况,特别是针对小米手机的权限跳转问题。
摘要由CSDN通过智能技术生成

小结:刚开始觉得短信发送很简单啊,不就是这样这样,再那样一下就好了嘛。但其实内容听繁琐的。坑不多,但需要判断的东西挺多。

首先需要判断有无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,可以使用动态权限。但用户在设置中禁止后,上面检测的方法检测不到权限是否开通。也就是用户点击了之后,就没反应了,体验不好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值