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

安卓如何实现发短信的操作

安卓通过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);

注意事项

  1. 权限适配:Android 11+发送短信需声明MANAGE_EXTERNAL_STORAGE或使用SmsManager
  2. 默认应用限制:Android 11+需用户手动设置默认短信应用。
  3. 隐私限制:部分厂商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_ACTIONDELIVERY_ACTION处理不同

安卓如何实现发短信的操作