上一篇
安卓开发发送短信选择双卡
- 行业动态
- 2025-04-21
- 2
基础方法(系统默认行为)
Android系统本身并未直接提供通用的双卡短信发送接口,默认情况下SmsManager.sendTextMessage()
会使用系统设置的默认SIM卡发送短信,若需手动选择SIM卡,需结合设备特性及厂商定制API。
厂商特定API实现(以小米/华为为例)
厂商 | 关键API类 | 核心方法 |
---|---|---|
小米 | android.telecom.SubscriptionManager |
getDefaultSmsSubId() getSlotIndex(int subId) |
华为 | com.huawei.telephony.TelephonyManager |
getSlotCount() getSimOperatorName(int slotId) |
示例代码(小米设备)
// 获取所有订阅号(SIM卡) SubscriptionManager manager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); List<SubscriptionInfo> subs = manager.getActiveSubscriptionInfoList(); // 选择第一个SIM卡发送短信 if (subs != null && !subs.isEmpty()) { int subId = subs.get(0).getSubscriptionId(); // 获取订阅ID SmsManager sms = SmsManager.getSmsManagerForSubscription(subId); sms.sendTextMessage(phoneNumber, null, message, null, null); }
判断设备双卡状态
通过TelephonyManager
可检测设备是否支持双卡:
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); int phoneCount = tm.getPhoneCount(); // >=2 表示双卡 boolean isSecondSimReady = tm.getSimState(1) == TelephonyManager.SIM_STATE_READY; // 判断第二张卡是否可用
通过Intent调用系统短信界面(间接选择)
若无法直接控制SIM卡,可通过隐式Intent跳转到系统短信应用,部分系统会弹出SIM卡选择框:
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:" + phoneNumber)); intent.putExtra("sms_body", message); // 部分厂商会在此界面显示SIM卡选择 startActivity(intent);
注意事项
权限要求:
SEND_SMS
:发送短信READ_PHONE_STATE
:读取SIM卡信息- 动态申请权限(Android 6.0+)
兼容性问题:
- 不同厂商API不统一(如OPPO、三星无公开API)
- Android 10+限制非默认应用发送短信(需引导用户设置默认应用)
隐私限制:
- Android Q(10)及以上版本限制访问SIM卡信息,需声明
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
(仅限系统应用)
- Android Q(10)及以上版本限制访问SIM卡信息,需声明
相关问题与解答
问题1:如何检测设备是否支持双卡?
解答:
通过TelephonyManager.getPhoneCount()
判断,返回值≥2即为双卡设备,需注意部分厂商可能虚拟多卡(如eSIM),需结合getSimState(int slotId)
判断SIM卡实际状态。
问题2:用户未插入SIM卡时如何处理?
解答:
- 调用
TelephonyManager.getSimState(int slotId)
检查SIM卡状态(SIM_STATE_ABSENT
表示无卡)。 - 提示用户插入SIM卡或选择其他可用卡槽。
- 若所有卡槽均不可用,禁用发送按钮并显示错误