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

安卓发送短信案例

安卓发送短信的两种方式

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

  • 原理:通过发送ACTION_SENDTOACTION_VIEW的Intent,触发系统短信应用完成发送。
  • 优点:无需额外权限,代码简单。
  • 缺点:依赖用户手动操作确认,无法获取发送结果。

使用SMSManager直接发送

  • 原理:通过SMSManagersendTextMessage方法直接发送短信。
  • 优点:可监听发送状态,适合自动化场景。
  • 缺点:需动态申请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中添加:

安卓发送短信案例  第1张

<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));
0