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

安卓发送短信回调

安卓通过SmsManager.sendTextMessage()方法发送短信,需设置PendingIntent作为回调,系统通过BroadcastReceiver返回发送

安卓发送短信回调实现原理

安卓系统通过SmsManager类提供短信发送功能,支持同步发送和异步回调两种方式,回调机制基于PendingIntent实现,系统在短信发送完成后触发广播,开发者通过注册BroadcastReceiver接收结果。


关键实现步骤

步骤 说明 代码示例
申请权限 AndroidManifest.xml声明SEND_SMS权限,并在运行时动态申请(Android 6.0+) <uses-permission android:name="android.permission.SEND_SMS"/>
创建SmsManager实例 通过SmsManager.getDefault()获取管理器 SmsManager smsManager = SmsManager.getDefault();
构造短信内容 支持长短信自动分拆(超过70字符) ArrayList<String> messages = smsManager.divideMessage(content);
设置发送回调 创建PendingIntent对象,用于接收发送状态广播 PendingIntent sentIntent = PendingIntent.getBroadcast(context, 0, new Intent(SENT_ACTION), PendingIntent.FLAG_UPDATE_CURRENT);
注册状态接收器 ActivityService中动态注册广播接收器 registerReceiver(sentReceiver, new IntentFilter(SENT_ACTION));
执行发送 调用sendTextMessage并传入回调Intent smsManager.sendTextMessage(phoneNumber, null, content, sentIntent, null);

回调结果处理

广播接收器实现

安卓发送短信回调

private final BroadcastReceiver sentReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        switch (getResultCode()) {
            case Activity.RESULT_OK:
                // 发送成功逻辑
                Log.d("SMS", "短信发送成功");
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
            case SmsManager.RESULT_ERROR_NO_SERVICE:
            case SmsManager.RESULT_ERROR_NULL_PDU:
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                // 发送失败处理
                Log.e("SMS", "短信发送失败,错误码:" + getResultCode());
                break;
        }
    }
};

常见错误码说明

错误码 含义
RESULT_ERROR_GENERIC_FAILURE 通用失败(如欠费停机)
RESULT_ERROR_NO_SERVICE 无信号或服务不可用
RESULT_ERROR_RADIO_OFF 飞行模式或射频关闭

注意事项

  1. 权限管理:需同时处理MANAGE_EXTERNAL_STORAGE(Android 11+)和POST_NOTIFICATIONS权限
  2. 多短信处理sendTextMessage方法返回的ArrayList<PendingIntent>需与分拆消息一一对应
  3. Android 12+限制:需添加<queries>声明访问短信数据库
  4. UI线程安全:发送操作需在子线程执行,避免阻塞主线程

完整代码示例

// 1. 动态申请权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, SMS_PERMISSION_CODE);
// 2. 发送短信方法
public void sendSms(String phoneNumber, String content) {
    SmsManager smsManager = SmsManager.getDefault();
    ArrayList<String> messageParts = smsManager.divideMessage(content);
    PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, 
        new Intent(SENT_ACTION), PendingIntent.FLAG_UPDATE_CURRENT);
    smsManager.sendMultipartTextMessage(phoneNumber, null, messageParts, sentIntent, null);
}
// 3. 注册接收器
@Override
protected void onStart() {
    super.onStart();
    registerReceiver(sentReceiver, new IntentFilter(SENT_ACTION));
}
@Override
protected void onStop() {
    super.onStop();
    unregisterReceiver(sentReceiver);
}

相关问题与解答

问题1:如何实现短信送达回执功能?

解答
安卓系统本身不直接支持短信送达回执(Delivery Report),但可通过以下方式间接实现:

安卓发送短信回调

  1. 使用deliveryIntent参数(sendTextMessage第5个参数)
  2. BroadcastReceiver中监听WAKE_LOCK相关广播
  3. 第三方SDK方案(如集成云通讯服务)
    注意:该功能依赖运营商网络支持,无法保证100%可靠性。

问题2:如何处理多条短信的发送状态?

解答
当发送长短信时,SmsManager.divideMessage()分割为多条,此时需:

  1. 为每条分片创建独立的PendingIntent
  2. BroadcastReceiver中通过getResultCode()判断每条状态
  3. 使用SparseArray记录各分片的发送结果
    示例代码:

    安卓发送短信回调

    Map<int, Boolean> resultMap = new SparseArray<>();
    @Override
    public void onReceive(Context context, Intent intent) {
     int partIndex = intent.getIntExtra("partIndex", -1);
     resultMap.put(partIndex, getResultCode() == Activity.RESULT_OK);
     // 检查所有分片是否发送成功
    }