Android 短信发送功能的核心代码是什么?

网站运维1个月前发布 未希
36 0

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

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()方法获取默认的短信管理器实例:

Android 短信发送功能的核心代码是什么?Android 短信发送功能的核心代码是什么?

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 短信发送功能的核心代码是什么?Android 短信发送功能的核心代码是什么?

以下是一个完整的示例代码,演示了如何在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版本可能会有不同的行为,建议在实际开发中进行充分的测试。

© 版权声明

相关文章

暂无评论

none
暂无评论...