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

安卓发送短信

安卓发送短信可通过SMSManager.getDefault().sendTextMessage()实现,需配置SEND_SMS权限并处理回调

安卓系统发送短信的常见方式

通过系统短信应用手动发送

  • 操作路径:打开系统自带「信息」应用 → 新建短信 → 输入收件人号码及内容 → 点击发送。
  • 特点:无需额外开发,依赖系统短信应用。

通过编程接口发送(适用于开发者)

安卓提供两种主要API实现短信发送:

方式 核心类/方法 适用场景
隐式Intent ACTION_SENDTO + Uri.parse(“smsto:”) 调用系统短信界面,用户确认发送
SMSManager SmsManager.getDefault().sendTextMessage() 直接发送,无需用户干预

使用SMSManager发送短信的代码示例

// 1. 添加权限
// AndroidManifest.xml
<uses-permission android:name="android.permission.SEND_SMS"/>
// 2. 动态申请权限(Android 6.0+)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_CODE);
}
// 3. 发送短信
public void sendSMS(String number, String message) {
    SmsManager smsManager = SmsManager.getDefault();
    // 长消息自动分拆
    ArrayList<String> divideContent = smsManager.divideMessage(message);
    for (String part : divideContent) {
        smsManager.sendTextMessage(number, null, part, null, null);
    }
}

通过隐式Intent调用系统短信应用

// 跳转到系统短信界面,填充收件人及内容
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:" + recipientNumber)); // 收件人号码
intent.putExtra("sms_body", messageContent); // 短信内容
startActivity(intent);

关键权限与兼容性处理

权限类型 声明方式 说明
基础权限 <uses-permission android:name="android.permission.SEND_SMS"/> 所有发送短信场景必须声明
运行时权限(Android 6.0+) requestPermissions() 需动态申请,否则会抛出 SecurityException
分发短信限制 单条短信长度不超过160字符(7字节中文) 使用 SmsManager.divideMessage() 自动分拆长消息

常见问题与解决方案

问题1:发送短信时崩溃,提示 SecurityException

  • 原因:未申请或未获得 SEND_SMS 权限。
  • 解决方案
    1. AndroidManifest.xml 中声明权限。
    2. 运行时动态申请权限(Android 6.0+)。

问题2:短信发送后无响应,回调未触发

  • 原因:未设置 PendingIntent 或被系统拦截。
  • 解决方案
    // 创建发送状态监听器
    PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, new Intent(SENT_ACTION), 0);
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    // 发送成功
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    // 发送失败
                    break;
            }
        }
    }, new IntentFilter(SENT_ACTION));

相关问题与解答

问题1:如何判断短信是否发送成功?

  • 解答:通过 PendingIntent 注册广播接收器监听发送状态,RESULT_OK 表示成功,其他错误码表示失败(如网络问题、号码无效等)。

问题2:Android 13(API 33)对短信权限有何新限制?

  • 解答:Android 13 新增 SEND_VOICE_CALL_ACTION 等精准权限,但发送短信仍沿用 SEND_SMS,需注意双卡设备需指定 Subscription_id,否则可能默认发送