当前位置:首页 > 行业动态 > 正文

安卓开发发送短信选择双卡

基础方法(系统默认行为)

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卡选择框:

安卓开发发送短信选择双卡  第1张

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:" + phoneNumber));
intent.putExtra("sms_body", message);
// 部分厂商会在此界面显示SIM卡选择
startActivity(intent);

注意事项

  1. 权限要求

    • SEND_SMS:发送短信
    • READ_PHONE_STATE:读取SIM卡信息
    • 动态申请权限(Android 6.0+)
  2. 兼容性问题

    • 不同厂商API不统一(如OPPO、三星无公开API)
    • Android 10+限制非默认应用发送短信(需引导用户设置默认应用)
  3. 隐私限制

    • Android Q(10)及以上版本限制访问SIM卡信息,需声明<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />(仅限系统应用)

相关问题与解答

问题1:如何检测设备是否支持双卡?

解答
通过TelephonyManager.getPhoneCount()判断,返回值≥2即为双卡设备,需注意部分厂商可能虚拟多卡(如eSIM),需结合getSimState(int slotId)判断SIM卡实际状态。


问题2:用户未插入SIM卡时如何处理?

解答

  1. 调用TelephonyManager.getSimState(int slotId)检查SIM卡状态(SIM_STATE_ABSENT表示无卡)。
  2. 提示用户插入SIM卡或选择其他可用卡槽。
  3. 若所有卡槽均不可用,禁用发送按钮并显示错误
0