安卓双卡手机编程实现短信前选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_STATE和SEND_SMS权限,否则无法获取SIM卡信息或发送短信。 - 部分设备可能对双卡API的支持有差异,建议在不同机型上测试兼容性。
- 如果需要监听短信发送状态,可以在
sendMultipartTextMessage的最后两个参数传入PendingIntent来接收结果。
内容的提问来源于stack exchange,提问作者jas




