安卓发送短信可通过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
权限。 - 解决方案:
- 在
AndroidManifest.xml
中声明权限。 - 运行时动态申请权限(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
,否则可能默认发送