在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版本可能会有不同的行为,建议在实际开发中进行充分的测试。