上一篇
安卓如何实现发短信的操作
- 行业动态
- 2025-04-23
- 9
安卓通过SmsManager类实现发短信,先获取默认实例,调用sendTextMessage方法,传入目的号码、
短信内容及发送状态回调
使用SmsManager发送短信
安卓提供了SmsManager
类用于发送短信,支持直接调用系统短信服务,以下是实现步骤:
添加权限
在AndroidManifest.xml
中声明发送短信权限:
<uses-permission android:name="android.permission.SEND_SMS"/>
注意:Android 6.0+需动态申请权限。
动态申请权限(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); }
发送短信代码
SmsManager smsManager = SmsManager.getDefault(); // 拆分长短信(超过70字符自动分割) ArrayList<String> messageParts = smsManager.divideMessage("Hello, this is a test message."); smsManager.sendTextMessage("1234567890", null, messageParts.get(0), null, null);
参数说明 | 类型 | 作用 |
---|---|---|
destinationAddress |
String | 接收方手机号 |
scAddress |
String | 短信中心号码(可为null) |
text |
String | |
sentIntent |
PendingIntent | 发送结果回调 |
deliveryIntent |
PendingIntent | 送达报告回调 |
接收发送状态广播
// 创建用于接收发送状态的PendingIntent PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT_ACTION), 0); // 注册广播接收器 registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (getResultCode() == Activity.RESULT_OK) { // 发送成功 } else { // 发送失败 } } }, new IntentFilter(SENT_ACTION));
通过ContentProvider操作短信数据库
安卓短信存储在content://sms/
ContentProvider中,可通过Uri
进行增删改查。
查询已发送短信
Cursor cursor = getContentResolver().query( Uri.parse("content://sms/sent"), // 已发送短信URI null, null, null, "date DESC"); // 按时间倒序 while (cursor.moveToNext()) { String address = cursor.getString(cursor.getColumnIndex("address")); String body = cursor.getString(cursor.getColumnIndex("body")); // 处理数据... } cursor.close();
写入草稿箱
ContentValues values = new ContentValues(); values.put("address", "1234567890"); // 接收方 values.put("body", "Draft message"); // 内容 getContentResolver().insert(Uri.parse("content://sms/draft"), values);
注意事项
- 权限适配:Android 11+发送短信需声明
MANAGE_EXTERNAL_STORAGE
或使用SmsManager
。 - 默认应用限制:Android 11+需用户手动设置默认短信应用。
- 隐私限制:部分厂商ROM可能限制第三方应用访问短信。
常见问题与解答
Q1:动态权限申请失败怎么办?
A:检查以下原因:
- 是否在
AndroidManifest.xml
声明权限; - 是否在
onRequestPermissionsResult
中正确处理回调; - 用户是否多次拒绝后勾选了”不再询问”(需引导至系统设置页)。
Q2:如何监听短信送达状态?
A:通过deliveryIntent
传递PendingIntent
:
PendingIntent deliveryPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERY_ACTION), 0); smsManager.sendTextMessage("1234567890", null, "Test", sentPI, deliveryPI);
在BroadcastReceiver
中区分SENT_ACTION
和DELIVERY_ACTION
处理不同