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 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

使用Java实现获取客户端IP地址

《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用Java实现获取客户端IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 首先是获取 IP,直接上代码import org.springframework.web.context.request.Requ

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤