在Android开发中,发送短信是一项基本功能,本文将详细介绍如何在Android应用中实现发送短信的核心代码,包括权限申请、消息管理器的获取、短信内容的拆分和发送,以及如何监控短信发送状态,以下是具体实现步骤:


一、权限申请
要在Android应用中发送短信,首先需要在AndroidManifest.xml文件中声明发送短信的权限:
<uses-permission android:name="android.permission.SEND_SMS"/>
如果目标API级别大于等于23(Android 6.0),还需要在运行时请求权限:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, 1);
}
二、核心代码
获取短信管理器
使用SmsManager类来管理短信发送,通过调用SmsManager.getDefault()方法获取默认的短信管理器实例:


SmsManager manager = SmsManager.getDefault();
拆分长短信
由于短信长度有限制(通常是160个字符),如果短信内容超过这个长度,需要将其拆分成多条短信发送,可以使用divideMessage方法进行拆分:
ArrayList<String> list = manager.divideMessage("这是一个很长的短信内容");
发送短信
使用sendTextMessage方法发送短信,该方法需要提供接收号码、短信中心号码(可以为null)、短信内容、发送意图和送达意图,下面是一个简单的示例:
manager.sendTextMessage("1234567890", null, "Hello, this is a test message!", null, null);
如果需要处理发送状态和送达状态,可以定义PendingIntent对象,并注册广播接收器:
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT"), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent("SMS_DELIVERED"), 0);
context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(context, "短信发送失败", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(context, "无线关闭", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(context, "PDU错误", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter("SMS_SENT"));
context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "短信已送达", Toast.LENGTH_SHORT).show();
}
}, new IntentFilter("SMS_DELIVERED"));
遍历拆分后的短信列表,逐一发送:
for (String text : list) {
manager.sendTextMessage("1234567890", null, text, sentPI, deliveredPI);
}
三、完整示例代码


以下是一个完整的示例代码,演示了如何在Android应用中发送短信:
package com.example.sendsms;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE_SMS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sendButton = findViewById(R.id.sendButton);
sendButton.setOnClickListener(v -> sendSMS("1234567890", "Hello, this is a test message!"));
}
private void sendSMS(String phoneNumber, String message) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_CODE_SMS);
} else {
performSendSMS(phoneNumber, message);
}
}
private void performSendSMS(String phoneNumber, String message) {
SmsManager manager = SmsManager.getDefault();
ArrayList<String> list = manager.divideMessage(message);
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT"), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent("SMS_DELIVERED"), 0);
context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(context, "短信发送失败", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(context, "无线关闭", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(context, "PDU错误", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter("SMS_SENT"));
context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "短信已送达", Toast.LENGTH_SHORT).show();
}
}, new IntentFilter("SMS_DELIVERED"));
for (String text : list) {
manager.sendTextMessage(phoneNumber, null, text, sentPI, deliveredPI);
}
}
}
在这个示例中,我们创建了一个按钮,当用户点击按钮时,会触发sendSMS方法,该方法首先检查是否具有发送短信的权限,如果没有则请求权限,一旦获得权限,就会调用performSendSMS方法发送短信,在performSendSMS方法中,我们获取默认的短信管理器,拆分短信内容,并发送每一条短信片段,我们还注册了广播接收器来监控短信发送状态和送达状态。
四、归纳
通过以上步骤,你可以在Android应用中实现发送短信的功能,需要注意的是,发送短信涉及到用户的隐私,因此在实际应用中应谨慎使用,并确保遵守相关法律法规,不同设备和Android版本可能会有不同的行为,建议在实际开发中进行充分的测试。