Android 获取短信内容

2024-06-01 15:38
文章标签 android 获取 短信内容

本文主要是介绍Android 获取短信内容,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小米手机需要去短信设置里,把系统短信优先关闭,不然短信广播是监听不到的。其他型号手机还没测试过。


首先注意权限

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

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


package com.example.smsreciver;import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.telephony.SmsMessage;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.widget.ScrollView;
import android.widget.TextView;public class MainActivity extends Activity {final String SMS_URI_ALL = "content://sms/";  			//所有信息final String SMS_URI_INBOX = "content://sms/inbox";  	//收件箱final String SMS_URI_SEND = "content://sms/sent";  		//已发送final String SMS_URI_DRAFT = "content://sms/draft";  	//草稿final String SMS_URI_OUTBOX = "content://sms/outbox";  	//发件箱final String SMS_URI_FAILED = "content://sms/failed";  	//发送失败final String SMS_URI_QUEUED = "content://sms/queued";  	//待发送列表static TextView tv;private String patternCoder = "(?<!\\d)\\d{6}(?!\\d)";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);tv = new TextView(this);  tv.setText(getSmsInPhone());  ScrollView sv = new ScrollView(this);  sv.addView(tv);  setContentView(sv);}@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();/*** 注册短信广播*/IntentFilter filter = new IntentFilter();filter.addAction("android.provider.Telephony.SMS_RECEIVED");filter.setPriority(Integer.MAX_VALUE);this.registerReceiver(SmsReciver, filter);}@Overrideprotected void onDestroy() {super.onDestroy();this.unregisterReceiver(SmsReciver);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}/*** 读取本机短信* @return*/public String getSmsInPhone() {  StringBuilder smsBuilder = new StringBuilder();  try {  Uri uri = Uri.parse(SMS_URI_INBOX);  String[] projection = new String[] { "_id", "address", "person", "body", "date", "type" };Cursor cur = getContentResolver().query(uri, projection, null, null, "date desc");if (cur.moveToFirst()) {  int index_Address = cur.getColumnIndex("address");  int index_Person = cur.getColumnIndex("person");  int index_Body = cur.getColumnIndex("body");  int index_Date = cur.getColumnIndex("date");  int index_Type = cur.getColumnIndex("type");  do {  String strAddress = cur.getString(index_Address); if(strAddress.equals("10086")){int intPerson = cur.getInt(index_Person);  String strbody = cur.getString(index_Body);  if(strbody.startsWith("尊敬的客户")){Log.e("", "getSmsInPhone"+strbody);long longDate = cur.getLong(index_Date);  int intType = cur.getInt(index_Type);  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Date d = new Date(longDate);  String strDate = dateFormat.format(d);  String strType = "";  if (intType == 1) {  strType = "接收";  } else if (intType == 2) {strType = "发送";  } else {  strType = "null";  }  smsBuilder.append("[ ");  smsBuilder.append(strAddress + ", ");  smsBuilder.append(intPerson + ", ");  smsBuilder.append(strbody + ", ");  smsBuilder.append(strDate + ", ");  smsBuilder.append(strType);  smsBuilder.append(" ]\n\n");}}} while (cur.moveToNext());  if (!cur.isClosed()) {  cur.close();  cur = null;  }  } else {  smsBuilder.append("no result!"); }smsBuilder.append("End!");  } catch (SQLiteException ex) {  Log.d("SQLiteException in getSmsInPhone", ex.getMessage());  }  return smsBuilder.toString();  } /*** 广播监听器,接收新收到的短信*/BroadcastReceiver SmsReciver = new BroadcastReceiver() {@Override  public void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();  SmsMessage msg = null;if (null != bundle) {Object[] smsObj = (Object[]) bundle.get("pdus");  for (Object object : smsObj){msg = SmsMessage.createFromPdu((byte[]) object);  Date date = new Date(msg.getTimestampMillis());SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  String receiveTime = format.format(date);  System.out.println("number:" + msg.getOriginatingAddress()  + "   body:" + msg.getDisplayMessageBody() + "  time:"  + receiveTime); if (msg.getOriginatingAddress().equals("10086")){String number = extractNumber(msg.getDisplayMessageBody());handler.sendEmptyMessage(1);}}}}};Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {tv.setText(getSmsInPhone());};};/*** 提取短信中的6个数字(验证码等)* * @param extractNumber* @return*/private String extractNumber(String content) {if (TextUtils.isEmpty(content)) {return null;}Pattern p = Pattern.compile(patternCoder);Matcher matcher = p.matcher(content);if (matcher.find()) {return matcher.group();}return null;}
}


sms主要结构: 

  1. _id => 短消息序号 如100  
  2. thread_id => 对话的序号 如100  
  3. address => 发件人地址,手机号.如+8613811810000  
  4. person => 发件人,返回一个数字就是联系人列表里的序号,陌生人为null  
  5. date => 日期  long型。如1256539465022  
  6. protocol => 协议 0 SMS_RPOTO, 1 MMS_PROTO   
  7. read => 是否阅读 0未读, 1已读   
  8. status => 状态 -1接收,0 complete, 64 pending, 128 failed   
  9. type => 类型 1是接收到的,2是已发出   
  10. body => 短消息内容   
  11. service_center => 短信服务中心号码编号。如+8613800755500  


这篇关于Android 获取短信内容的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021413

相关文章

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目