You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

安卓双卡手机编程实现短信前选SIM及获取SubscriptionId方法

安卓双卡手机:实现短信发送前的SIM选择提示并获取SubscriptionId

我来一步步解决你的两个问题,结合你给出的代码片段来完善实现:


一、实现发送短信前的SIM卡选择提示

要做到这一点,我们需要先获取设备上的可用SIM卡信息,再通过对话框让用户选择,最后用选中的SIM卡发送短信。步骤如下:

1. 申请必要权限

首先在AndroidManifest.xml中声明所需权限:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

注意:Android 6.0(API 23)及以上版本需要动态申请这些危险权限,所以在代码中要先检查权限是否已授予,未授予的话发起申请。

2. 获取可用SIM卡的订阅信息

从API 22(LOLLIPOP_MR1)开始,Android提供了SubscriptionManager来管理双卡订阅信息。我们可以用它获取活跃的SIM卡列表:

// 检查API版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
    SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
    // 获取所有活跃的SIM卡订阅信息
    List<SubscriptionInfo> subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();
    
    if (subscriptionInfoList != null && !subscriptionInfoList.isEmpty()) {
        // 准备SIM选择的选项数据
        String[] simOptions = new String[subscriptionInfoList.size()];
        for (int i = 0; i < subscriptionInfoList.size(); i++) {
            SubscriptionInfo info = subscriptionInfoList.get(i);
            // 用运营商名称+SIM名称作为选项文本,比如"中国移动 - SIM 1"
            simOptions[i] = info.getCarrierName() + " - " + info.getDisplayName();
        }
        // 弹出选择对话框
        showSimSelectionDialog(simOptions, subscriptionInfoList);
    } else {
        // 没有可用SIM卡的处理逻辑
        Toast.makeText(this, "未检测到可用SIM卡", Toast.LENGTH_SHORT).show();
    }
} else {
    // API低于22,只能使用默认SIM卡发送
    sendSmsWithDefaultSim(phoneNumber, message);
}

3. 弹出SIM卡选择对话框

AlertDialog让用户选择要使用的SIM卡,选择后拿到对应的SubscriptionId

private void showSimSelectionDialog(String[] simOptions, List<SubscriptionInfo> subscriptionInfoList) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("选择发送短信的SIM卡")
           .setItems(simOptions, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which) {
                   // 获取选中SIM卡的SubscriptionId
                   int selectedSubscriptionId = subscriptionInfoList.get(which).getSubscriptionId();
                   // 用选中的SIM卡发送短信
                   sendSmsWithSelectedSim(phoneNumber, message, selectedSubscriptionId);
               }
           })
           .setCancelable(false)
           .show();
}

二、通过SIM选择提示获取SubscriptionId并完善你的代码

你给出的代码框架已经正确,只需要把选中的SubscriptionId传入getSmsManagerForSubscriptionId()方法即可。完整的发送短信方法如下:

private void sendSmsWithSelectedSim(String phoneNumber, String message, int subscriptionId) {
    SmsManager smsManager = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
        // 传入选中的SubscriptionId
        smsManager = SmsManager.getSmsManagerForSubscriptionId(subscriptionId);
    } else {
        smsManager = SmsManager.getDefault();
    }
    
    try {
        // 拆分长短信(如果内容过长)
        ArrayList<String> messageParts = smsManager.divideMessage(message);
        smsManager.sendMultipartTextMessage(phoneNumber, null, messageParts, null, null);
        Toast.makeText(this, "短信发送成功", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(this, "短信发送失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
}

// 兼容低版本的默认SIM发送方法
private void sendSmsWithDefaultSim(String phoneNumber, String message) {
    SmsManager smsManager = SmsManager.getDefault();
    try {
        ArrayList<String> messageParts = smsManager.divideMessage(message);
        smsManager.sendMultipartTextMessage(phoneNumber, null, messageParts, null, null);
        Toast.makeText(this, "短信发送成功", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(this, "短信发送失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
}

注意事项

  • 确保用户已授予READ_PHONE_STATESEND_SMS权限,否则无法获取SIM卡信息或发送短信。
  • 部分设备可能对双卡API的支持有差异,建议在不同机型上测试兼容性。
  • 如果需要监听短信发送状态,可以在sendMultipartTextMessage的最后两个参数传入PendingIntent来接收结果。

内容的提问来源于stack exchange,提问作者jas

火山引擎 最新活动