当前位置: 首页 > news >正文

Android 获取短信验证

Android 获取短信验证

Android 获取短信验证
输入发短信的手机号,点击获取验证码,等接收到验证码后就会自动获取

SmsReceiver.Java


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.telephony.SmsMessage;public class SmsReceiver extends BroadcastReceiver {private Handler handler;public SmsReceiver(Handler handler) {this.handler = handler;}@Overridepublic void onReceive(Context context, Intent intent) {// 获取短信类型String format = intent.getStringExtra("format");Bundle bundle = intent.getExtras();// 提前短信消息Object[] pdus = (Object[]) bundle.get("pdus");SmsMessage[] messages = new SmsMessage[pdus.length];if (Build.VERSION.SDK_INT >= 23) {for (int i = 0; i < messages.length; i++) {// 此方法适用于Android6.0messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);}} else {for (int i = 0; i < messages.length; i++) {messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);}}String number = messages[0].getOriginatingAddress();String content = "";for (SmsMessage message : messages) {// 获取短信内容content += message.getMessageBody();}Message message = handler.obtainMessage();message.what = 123;Bundle bundle1 = new Bundle();bundle.putString("number", number);bundle.putString("content", content);message.setData(bundle);handler.sendMessage(message);}}

ReceiveMessage.Java


import android.Manifest;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import com.xxh.test1.R;public class ReceiveMessage extends AppCompatActivity {private EditText smsContent;private EditText smsNumber;private SmsReceiver smsReceiver;private Handler handler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);if (msg.what == 123) {Bundle bundle = msg.getData();smsContent.setText(bundle.getString("content"));smsNumber.setText(bundle.getString("number"));unregisterReceiver(smsReceiver);}}};@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_receive);initView();}private void initView() {smsContent = (EditText) findViewById(R.id.confirm_text);smsNumber = (EditText) findViewById(R.id.confirm_number);Button smsButton = (Button) findViewById(R.id.confirm_button);smsButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {getPermission();}});}public void registerSmsReceiver() {IntentFilter receiverFilter = new IntentFilter();receiverFilter.addAction("android.provider.Telephony.SMS_RECEIVED");smsReceiver = new SmsReceiver(handler);registerReceiver(smsReceiver, receiverFilter);}private void getPermission() {if (Build.VERSION.SDK_INT >= 23) {int checkCALLPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS);// 判断是否具有权限if (checkCALLPermission != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, 1);return;} else {registerSmsReceiver();}} else {registerSmsReceiver();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "获取权限成功", Toast.LENGTH_SHORT).show();// 获取权限成功,发送短信registerSmsReceiver();} else {Toast.makeText(this, "获取权限失败", Toast.LENGTH_SHORT).show();}break;default:super.onRequestPermissionsResult(requestCode, permissions, grantResults);}}
}

activity_receive.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".receivemessage.ReceiveMessage"><EditTextandroid:id="@+id/confirm_number"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:hint="请输入电话号码"android:textSize="22sp" /><EditTextandroid:id="@+id/confirm_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:hint="短信内容"android:textSize="22sp" /><Buttonandroid:id="@+id/confirm_button"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="获取短信验证码" /></LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"><uses-featureandroid:name="android.hardware.telephony"android:required="true" /><uses-permission android:name="android.permission.RECEIVE_SMS" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name_receive"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Learn"><activityandroid:name=".receivemessage.ReceiveMessage"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
http://www.lryc.cn/news/420700.html

相关文章:

  • 负载均衡详细概念介绍之(四层和七层实现)
  • 力扣 | 递增子序列 | 动态规划 | 最长递增子序列、最长递增子序列的个数、及其变式
  • 008 | 基于RNN和LSTM的贵州茅台股票开盘价预测
  • 尚硅谷谷粒商城项目笔记——六、使用navciat连接docker中的mysql容器【电脑CPU:AMD】
  • 【git】本地更改了,但又想直接从远端拉取覆盖本地(放弃本地更改前行下载)
  • 基于JSP的书店仓库管理系统
  • pytorch框架保存和加载模型
  • 开发输出防护栏以检测GPT-4o幻觉
  • 代码复现,代码改进,算法复现,模型复现
  • 基于STM32开发的智能机器人系统
  • 【数据结构题目】循环队列,以及队列实现栈的模拟
  • 大数据CloudSim应用实践:基于CloudSimExamle6.java修改(超详细教程)
  • 完美解决浏览器的输入框自动填入时,黄色背景问题,以及图标被遮住问题(最新)
  • C 语言中的头文件
  • 数据结构复杂度
  • MySQL基础篇
  • 详解C++中的四种强制转换reinterpret_cast / const_cast / static_cast / dynamic_cast
  • Word中加载Mathtype后粘贴复制快捷键(Ctrl+C/V)不能使用
  • Linux硬件-bios
  • VisionPro二次开发学习笔记12-使用CogToolGroup控件进行图像检测
  • mfc140u.dll丢失的科学修复手段,简单又方便的mfc140u.dll修复
  • RabbitMQ、Kafka对比(超详细),Kafka、RabbitMQ、RocketMQ的区别
  • 【案例35】销售订单公式问题导致系统宕机
  • 编程-设计模式 4:建造者模式
  • 百度文心一言API调用,千帆大模型获取API Key和API Secret图解
  • kafka下载|安装
  • 贪心算法part03
  • 以树莓集团的视角:探索AI技术如何重塑数字媒体产业发展
  • package.json的 和 的区别,以及|| 和 | 的区别
  • Wireshark_DNS_v7.0