如何在Android中监听并获取短信发送状态?

在Android应用开发中,监听短信发送状态是一项常见需求,本文将详细介绍如何在Android应用中实现短信发送及发送状态的监听,并提供相应的代码示例。

如何在Android中监听并获取短信发送状态?

一、添加权限和依赖项

1. AndroidManifest.xml

需要在AndroidManifest.xml文件中添加发送短信的权限:

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

build.gradle

在app的build.gradle文件中添加依赖项:

dependencies {
    implementation 'com.android.support:support-annotations:28.0.0'
    // 如果需要使用广播就加service
}

二、创建发送短信的方法

如何在Android中监听并获取短信发送状态?

创建一个方法用于发送短信,并注册一个BroadcastReceiver来监听发送状态。

SendMessage类

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.Message;
import android.telephony.gsm.SmsManager;
import android.widget.Toast;
public class SendMessage {
    private static final String TAG = "SendMsg";
    private String SENT_SMS_ACTION = "SENT_SMS_ACTION";
    private Context context;
    private Intent sentIntent = new Intent(SENT_SMS_ACTION);
    private SmsManager smsManager;
    private PendingIntent sentPI;
    private String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
    private Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
    private PendingIntent deliverPI;
    private String qid = "0"; // 短信序列号ID
    public SendMessage(Context c) {
        this.context = c;
        smsManager = SmsManager.getDefault();
        sentPI = PendingIntent.getBroadcast(context, 0, sentIntent, 0);
        // 短信发送状态监控
        context.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        MyLog.i(TAG, "信息已发出");
                        updateStatus(qid, "1");
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(context, "未指定失败 
 信息未发出,请重试", Toast.LENGTH_LONG).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(context, "无线连接关闭 
 信息未发出,请重试", Toast.LENGTH_LONG).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(context, "PDU失败 
 信息未发出,请重试", Toast.LENGTH_LONG).show();
                        break;
                }
            }
        }, new IntentFilter(SENT_SMS_ACTION));
        // 短信是否被接收状态监控
        deliverPI = PendingIntent.getBroadcast(context, 0, deliverIntent, 0);
        context.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // myDialog.setMessage("已送达服务终端");
                // checkService();
            }
        }, new IntentFilter(DELIVERED_SMS_ACTION));
    }
    /**
     * 发送短信,这里是我需要的几个参数,你可以根据你的具体情况来使用不同的参数
     * @param qid 短信序列号ID
     * @param mobile 要发送的目标手机号,这个必须要有
     * @param code 短信验证码
     * @param msg 发送的短信内容
     */
    public void send(String qid, String mobile, String code, String msg) {
        this.qid = qid;
        String msg1 = "尊敬的客户,您正在进行";
        String msg2 = "(6小时内有效),我站工作人员不会向您索取短信内容,[带你玩新乡]";
        msg1 += msg + "操作,短信授权码为";
        String content = msg1 + code + msg2;
        List<String> divideContents = smsManager.divideMessage(content);
        for (String text : divideContents) {
            try {
                smsManager.sendTextMessage(mobile, null, text, sentPI, deliverPI);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private void updateStatus(String qid, String status) {
        // 根据业务逻辑更新短信状态,例如保存到数据库或调用API接口
    }
}

三、注册并创建监听发送状态的BroadcastReceiver

SMSListener类

创建一个自定义的BroadcastReceiver类来监听短信发送状态:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
public class SMSListener extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 获取 SMS 消息数据
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdus = (Object[]) bundle.get("pdus");
            for (Object pdu : pdus) {
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
                String sender = smsMessage.getDisplayOriginatingAddress();
                String messageBody = smsMessage.getMessageBody();
                // 打印出短信的发件人及内容
                Log.d("SmsListener", "Sender: " + sender + ", Message: " + messageBody);
                // 这里可以加入自定义处理逻辑,例如发送通知、弹出对话框等
            }
        }
    }
}

MainActivity类

在应用的启动ActivityApplication中注册这个BroadcastReceiver,以便接收到短信的广播:

import android.content.IntentFilter;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
    private SMSListener smsListener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        smsListener = new SMSListener();
        IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(smsListener, filter);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(smsListener);
    }
}

四、运行时权限请求(适用于Android 6.0及以上)

如何在Android中监听并获取短信发送状态?

在Android 6.0 (API级别23)及以上版本中,您需要在应用运行时请求用户允许读取短信的权限,以下是一个简单的权限请求示例:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
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 SMS_PERMISSION_CODE = 123;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 检查权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, SMS_PERMISSION_CODE);
        } else {
            // 权限已经被授予,执行相关操作
        }
    }
}

五、归纳与展望

通过上述步骤,我们实现了在Android应用中监听短信发送状态的功能,这一功能在许多应用场景中都非常有用,例如用户验证、消息提醒等,随着Android系统的不断升级和用户需求的变化,我们可能需要进一步优化和完善这一功能,以提供更好的用户体验。

到此,以上就是小编对于“android监听短信发送状态”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/638322.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-11-10 17:55
Next 2024-11-10 17:56

相关推荐

  • openstack和kubernetes

    OpenStack和Kubernetes都是目前最为流行的开源云计算平台,它们各自具有独特的优势和适用场景,因此选择哪一个更适合你的管理需求,需要根据你的具体情况来判断。OpenStack是一个开源的云计算管理平台项目,它提供了一系列的基础设施即服务(IaaS)的解决方案,包括虚拟机、块存储、网络等,OpenStack的核心组件是No……

    2023-12-07
    0199
  • asp服务器架设的步骤是什么

    1. 安装IIS服务器;2. 配置IIS服务器;3. 安装ASP组件;4. 编写ASP程序;5. 测试ASP程序。

    2024-05-10
    071
  • 什么是负载均衡器?它如何工作?

    负载均衡(Load Balancing)是一种将工作负载分配到多个计算资源的技术,旨在优化性能、提高可靠性和增加可扩展性,它通过在多个服务器或资源之间智能分配请求,防止任何一个资源过载或失效导致应用程序的性能下降或停止响应,一、负载均衡的类型1、硬件负载均衡描述:通过专用的硬件设备实现负载均衡,如F5、Radw……

    2024-11-12
    02
  • 文档为什么输入不了0

    文档输入0可能是因为格式设置问题,或者使用了不支持数字0的特定软件或系统。请检查设置并尝试使用其他工具。

    2024-05-18
    088
  • 服务器如何实现域名访问?

    服务器域名访问配置指南通过域名访问Web服务器是一个涉及多个步骤的过程,包括注册域名、配置DNS记录、设置Web服务器和部署SSL证书等,下面将详细介绍每个步骤:一、注册域名1、选择域名注册商:选择一个合适的域名注册商是第一步,常见的域名注册商包括GoDaddy、Namecheap和Google Domains……

    2024-11-09
    06
  • vosent

    Vosent 是一个高度集成的智能语音识别系统,旨在提供快速、准确的语音到文本转换服务,它利用先进的深度学习技术和大量的数据集来训练其模型,以确保在各种语言和方言中都能实现高准确率,以下是对Vosent系统的详细介绍:核心技术自动语音识别 (ASR)Vosent 使用自动语音识别技术将人声转化为可读的文本格式,这一过程包括声音信号处理……

    2024-04-11
    0149

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入