上一篇
安卓发送短信
- 行业动态
- 2025-04-23
- 4
安卓发送短信可通过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
,否则可能默认发送