上一篇
安卓发送短信案例
- 行业动态
- 2025-04-22
- 5
安卓发送短信的两种方式
通过隐式Intent调用系统短信应用
- 原理:通过发送
ACTION_SENDTO
或ACTION_VIEW
的Intent,触发系统短信应用完成发送。 - 优点:无需额外权限,代码简单。
- 缺点:依赖用户手动操作确认,无法获取发送结果。
使用SMSManager
直接发送
- 原理:通过
SMSManager
的sendTextMessage
方法直接发送短信。 - 优点:可监听发送状态,适合自动化场景。
- 缺点:需动态申请
SEND_SMS
权限,部分机型可能有限制。
权限配置与动态申请
AndroidManifest.xml配置
<uses-permission android:name="android.permission.SEND_SMS"/>
动态权限申请(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_SMS); } // 处理权限回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_CODE_SMS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限已授予,执行发送操作 } else { // 权限被拒绝,提示用户 } } }
代码实现示例
通过隐式Intent发送短信
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:" + phoneNumber)); // 目标手机号 intent.putExtra("sms_body", "Hello, this is a test message!"); // 短信内容 startActivity(intent);
使用SMSManager
发送短信
SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(phoneNumber, null, messageContent, sentStatusCallback, null); // 发送状态回调 private void sendSmsCallback(String message) { Toast.makeText(this, "短信发送成功: " + message, Toast.LENGTH_SHORT).show(); } private void sendSmsFailed(String error) { Toast.makeText(this, "短信发送失败: " + error, Toast.LENGTH_SHORT).show(); }
两种方式对比表
特性 | 隐式Intent | SMSManager |
---|---|---|
权限要求 | 无(仅调用系统应用) | 需要SEND_SMS 权限 |
用户交互 | 需要用户手动确认发送 | 可后台静默发送 |
发送状态反馈 | 无 | 支持(通过回调) |
适用场景 | 简单场景(如用户主动触发) | 自动化任务(如验证码发送) |
常见问题与解决方案
权限申请被拒绝
- 原因:用户未授权或系统禁止。
- 解决:在
onRequestPermissionsResult
中处理拒绝逻辑,提示用户前往设置开启权限。
短信无法发送
- 原因:
- 未正确配置权限。
- 目标设备无SIM卡或信号。
- 系统短信应用被禁用。
- 解决:检查权限、设备状态及系统设置。
相关问题与解答
问题1:如何兼容Android 13的短信权限限制?
解答:
Android 13(API 33)新增了SEND_RESPOND_VIA_MESSAGE
权限,用于发送闪回短信,若需兼容,需在AndroidManifest.xml
中添加:
<uses-permission android:name="android.permission.SEND_RESPOND_VIA_MESSAGE"/>
并在运行时动态申请该权限。
问题2:如何监听SMSManager
的发送结果?
解答:
通过sendTextMessage
的第4个参数传入PendingIntent
对象,系统会在短信发送后触发对应的BroadcastReceiver
。
// 创建广播意图 Intent intent = new Intent(SMS_SENT_ACTION); PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 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(SMS_SENT_ACTION));