安卓系统通过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); |
注册状态接收器 | 在Activity 或Service 中动态注册广播接收器 |
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 |
飞行模式或射频关闭 |
MANAGE_EXTERNAL_STORAGE
(Android 11+)和POST_NOTIFICATIONS
权限sendTextMessage
方法返回的ArrayList<PendingIntent>
需与分拆消息一一对应<queries>
声明访问短信数据库// 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); }
解答:
安卓系统本身不直接支持短信送达回执(Delivery Report),但可通过以下方式间接实现:
deliveryIntent
参数(sendTextMessage
第5个参数) BroadcastReceiver
中监听WAKE_LOCK
相关广播 解答:
当发送长短信时,SmsManager.divideMessage()
分割为多条,此时需:
PendingIntent
BroadcastReceiver
中通过getResultCode()
判断每条状态 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); // 检查所有分片是否发送成功 }