在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 }
二、创建发送短信的方法
创建一个方法用于发送短信,并注册一个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类
在应用的启动Activity
或Application
中注册这个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 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