You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过SmsManager发送短信?解决提示发送成功但实际未送达问题

Hey,我来帮你搞定这个问题!你遇到的情况其实挺典型的:当你用SmsManager.sendTextMessage()直接发送短信时,这个方法是通过运营商网络直接发信,不会自动写入系统的短信内容提供商(Content Provider),所以短信应用读不到这条发送记录,自然就看不到啦。下面给你两种靠谱的解决办法:

问题原因解析

核心问题就在于:SmsManager的直接发送接口是底层通信层面的操作,不会主动同步记录到系统短信数据库,而短信应用的发送列表是从系统数据库里读取数据的,所以才会出现"APP提示发送成功,但短信APP无记录"的矛盾情况。

两种可行解决方案

方案一:手动写入短信到系统短信数据库

发送短信成功后,我们主动把这条短信插入到系统的短信数据库中,让短信应用能读取到记录。

前置准备

首先得在AndroidManifest.xml里添加权限:

<uses-permission android:name="android.permission.WRITE_SMS" />

⚠️ 注意:Android 6.0(API 23)及以上版本,还需要在代码中动态申请这个权限,不然会触发权限拒绝错误。

代码实现

在你调用smsManager.sendTextMessage()的成功逻辑里(或者发送语句之后),添加这段代码:

// 准备要插入的短信数据
ContentValues smsValues = new ContentValues();
smsValues.put("address", myNum); // 接收方号码,即你从EditText获取的myNum
smsValues.put("body", "这里替换成你实际发送的短信内容");
smsValues.put("date", System.currentTimeMillis()); // 发送时间戳
smsValues.put("type", 2); // 2代表已发送短信,1代表收件箱短信

// 插入到系统短信的已发送目录
getContentResolver().insert(Uri.parse("content://sms/sent"), smsValues);

方案二:调用系统短信应用发送短信

如果不想手动处理数据库操作,更简单的方式是直接唤起系统自带的短信应用来发送短信,这样发送后的记录会自动被系统保存到短信数据库里。

代码实现

替换你原来的SmsManager相关代码,改用Intent跳转:

EditText editText = (EditText) findViewById(R.id.editText);
String myNum = editText.getText().toString();
String smsContent = "替换成你要发送的短信内容";

// 创建发送短信的Intent
Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:" + myNum)); // 指定收件人号码
smsIntent.putExtra("sms_body", smsContent); // 预设短信内容

// 检查是否有能处理这个Intent的应用(即系统短信APP)
if (smsIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(smsIntent);
}

这种方式的好处是不需要申请WRITE_SMS权限,而且用户可以在熟悉的系统短信界面确认发送,体验更符合日常使用习惯。

额外提醒
  • 如果你用的是Android 10(API 29)及以上版本,系统限制了WRITE_SMS权限的使用,手动写入数据库的方法可能会失效,这种情况下优先选方案二。
  • 测试的时候可以用你提供的示例号码"8667404531"来验证效果。

内容的提问来源于stack exchange,提问作者Jackson Ennis

火山引擎 最新活动