安卓提供了SmsManager
类用于发送短信,支持直接调用系统短信服务,以下是实现步骤:
在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); }
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));
安卓短信存储在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);
MANAGE_EXTERNAL_STORAGE
或使用SmsManager
。A:检查以下原因:
AndroidManifest.xml
声明权限;onRequestPermissionsResult
中正确处理回调;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
处理不同