Android手机上监听短信的两种方式
Android手机上监听短信有两种方式:
1、 接受系统的短信广播,操作短信内容。
优点:操作方便,适合简单的短信应用。
缺点:来信会在状态栏显示通知信息。
AndroidManifest.xml:
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <!-- Receiver --> <receiver android:name=".sms.SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> |
code:
package org.anymobile.demo.sms; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.gsm.SmsMessage; import android.util.Log; public class SMSReceiver extends BroadcastReceiver { public static final String TAG = "ImiChatSMSReceiver"; //android.provider.Telephony.Sms.Intents public static final String SMS_RECEIVED_ACTION ="android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(SMS_RECEIVED_ACTION)) { SmsMessage[] messages = getMessagesFromIntent(intent); for (SmsMessage message : messages) { Log.i(TAG, message.getOriginatingAddress() + " : " + message.getDisplayOriginatingAddress() + " : " + message.getDisplayMessageBody() + " : " + message.getTimestampMillis()); } } } public final SmsMessage[] getMessagesFromIntent(Intent intent) { Object[] messages = (Object[]) intent.getSerializableExtra("pdus"); byte[][] pduObjs = new byte[messages.length][]; for (int i = 0; i < messages.length; i++) { pduObjs[i] = (byte[]) messages[i]; } byte[][] pdus = new byte[pduObjs.length][]; int pduCount = pdus.length; SmsMessage[] msgs = new SmsMessage[pduCount]; for (int i = 0; i < pduCount; i++) { pdus[i] = pduObjs[i]; msgs[i] = SmsMessage.createFromPdu(pdus[i]); } return msgs; } } |
2、 应用观察者模式,监听短信数据库,操作短信内容。
优点:可以拦截来信在状态栏的显示通知,适合作短信拦截。
缺点:可以发展成MU,在后台悄悄的收/发短信。
实例如下:
SystemEventReceiver:收到开机启动OK的广播后,启动BootService服务;收到应用发送短信的INTENT后,调用系统接口发送短信
BootService:开启服务后,打开短信监听器
SMSObserver:数据观察者,监听短信数据库
SMSHandler:短信处理器
AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_SMS"></uses-permission> <uses-permission android:name="android.permission.WRITE_SMS"></uses-permission> <!-- Service --> <service android:name=".BootService" android:label="@string/app_name"> <intent-filter> <actionandroid:name="org.anymobile.test.service.IMICHAT" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <!-- Receiver --> <receiver android:name=".SystemEventReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> |
code:
package org.anymobile.demo.sms; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Handler; import android.os.Message; import android.util.Log; public class SMSHandler extends Handler { public static final String TAG = "SMSHandler"; private Context mContext; public SMSHandler(Context context) { super(); this.mContext = context; } public void handleMessage(Message message) { Log.i(TAG, "handleMessage: " + message); MessageItem item = (MessageItem) message.obj; //delete the sms Uri uri = ContentUris.withAppendedId(SMS.CONTENT_URI, item.getId()); mContext.getContentResolver().delete(uri, null, null); Log.i(TAG, "delete sms item: " + item); } } |
package org.anymobile.demo.sms; import android.content.ContentResolver; import android.database.ContentObserver; import android.database.Cursor; import android.os.Handler; import android.os.Message; import android.util.Log; public class SMSObserver extends ContentObserver { public static final String TAG = "SMSObserver"; private static final String[] PROJECTION = new String[] { SMS._ID,//0 SMS.TYPE,//1 SMS.ADDRESS,//2 SMS.BODY,//3 SMS.DATE,//4 SMS.THREAD_ID,//5 SMS.READ,//6 SMS.PROTOCOL//7 }; private static final String SELECTION = SMS._ID + " > %s" + // " and " + SMS.PROTOCOL + " = null" + // " or " + SMS.PROTOCOL + " = " + SMS.PROTOCOL_SMS + ")" + " and (" + SMS.TYPE + " = " + SMS.MESSAGE_TYPE_INBOX + " or " + SMS.TYPE + " = " + SMS.MESSAGE_TYPE_SENT + ")"; private static final int COLUMN_INDEX_ID = 0; private static final int COLUMN_INDEX_TYPE = 1; private static final int COLUMN_INDEX_PHONE = 2; private static final int COLUMN_INDEX_BODY = 3; private static final int COLUMN_INDEX_PROTOCOL = 7; private static final int MAX_NUMS = 10; private static int MAX_ID = 0; private ContentResolver mResolver; private Handler mHandler; public SMSObserver(ContentResolver contentResolver, Handler handler) { super(handler); this.mResolver = contentResolver; this.mHandler = handler; } @Override public void onChange(boolean selfChange) { Log.i(TAG, "onChange : " + selfChange + "; " + MAX_ID + "; " +SELECTION); super.onChange(selfChange); Cursor cursor = mResolver.query(SMS.CONTENT_URI, PROJECTION, String.format(SELECTION, MAX_ID), null, null); int id, type, protocol; String phone, body; Message message; MessageItem item; int iter = 0; boolean hasDone = false; while (cursor.moveToNext()) { id = cursor.getInt(COLUMN_INDEX_ID); type = cursor.getInt(COLUMN_INDEX_TYPE); phone = cursor.getString(COLUMN_INDEX_PHONE); body = cursor.getString(COLUMN_INDEX_BODY); protocol = cursor.getInt(COLUMN_INDEX_PROTOCOL); if (hasDone) { MAX_ID = id; break; } if (protocol == SMS.PROTOCOL_SMS && body != null && body.startsWith(SMS.FILTER)) { hasDone = true; item = new MessageItem(); item.setId(id); item.setType(type); item.setPhone(phone); item.setBody(body); item.setProtocol(protocol); message = new Message(); message.obj = item; mHandler.sendMessage(message); } else { if (id > MAX_ID) MAX_ID = id; } if (iter > MAX_NUMS) break; iter ++; } } } |
package org.anymobile.demo.sms; import android.net.Uri; import android.provider.BaseColumns; public interface SMS extends BaseColumns { public static final Uri CONTENT_URI = Uri.parse("content://sms"); public static final String FILTER = "!imichat"; public static final String TYPE = "type"; public static final String THREAD_ID = "thread_id"; public static final String ADDRESS = "address"; public static final String PERSON_ID = "person"; public static final String DATE = "date"; public static final String READ = "read"; public static final String BODY = "body"; public static final String PROTOCOL = "protocol"; public static final int MESSAGE_TYPE_ALL = 0; public static final int MESSAGE_TYPE_INBOX = 1; public static final int MESSAGE_TYPE_SENT = 2; public static final int MESSAGE_TYPE_DRAFT = 3; public static final int MESSAGE_TYPE_OUTBOX = 4; public static final int MESSAGE_TYPE_FAILED = 5; // for failed outgoing messages public static final int MESSAGE_TYPE_QUEUED = 6; // for messages to send later public static final int PROTOCOL_SMS = 0;//SMS_PROTO public static final int PROTOCOL_MMS = 1;//MMS_PROTO } |
package org.anymobile.demo.sms; public class MessageItem implements java.io.Serializable { private static final long serialVersionUID = 1L; private int id; private int type; private int protocol; private String phone; private String body; public MessageItem() {} public int getId() { return id; } public void setId(int id) { this.id = id; } public int getType() { return type; } public void setType(int type) { this.type = type; } public int getProtocol() { return protocol; } public void setProtocol(int protocol) { this.protocol = protocol; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String toString() { return "id = " + id + ";" + "type = " + type + ";" + "protocol = " + protocol + ";" + "phone = " + phone + ";" + "body = " + body; } } |
package org.anymobile.demo; import android.app.Service; import android.content.ContentResolver; import android.content.Intent; import android.database.ContentObserver; import android.os.Handler; import android.os.IBinder; import android.os.Process; import android.util.Log; import org.anymobile.demo.sms.SMS; import org.anymobile.demo.sms.SMSHandler; import org.anymobile.demo.sms.SMSObserver; public class BootService extends Service { public static final String TAG = "BootService"; private ContentObserver mObserver; private Handler mHandler = new Handler(); @Override public void onCreate() { Log.i(TAG, "onCreate()."); super.onCreate(); addSMSObserver(); } public void addSMSObserver() { Log.i(TAG, "add a SMS observer. "); ContentResolver resolver = getContentResolver(); Handler handler = new SMSHandler(this); mObserver = new SMSObserver(resolver, handler); resolver.registerContentObserver(SMS.CONTENT_URI, true,mObserver); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { Log.i(TAG, "onDestroy()."); this.getContentResolver().unregisterContentObserver(mObserver); super.onDestroy(); Process.killProcess(Process.myPid()); System.exit(0); } } |
package org.anymobile.demo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; //import android.os.Handler; //import android.os.Message; import android.telephony.gsm.SmsManager; import org.anymobile.demo.sms.MessageItem; public class SystemEventReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { context.startService(new Intent(Globals.IMICHAT_SERVICE)); } else if (intent.getAction().equals(Globals.ACTION_SEND_SMS)) { MessageItem mItem = (MessageItem) intent.getSerializableExtra(Globals.EXTRA_SMS_DATA); if (mItem != null && mItem.getPhone() != null && mItem.getBody() != null) { SmsManager.getDefault() .sendTextMessage(mItem.getPhone(), null, mItem.getBody(), null, null); // new Thread(mTasks).start(); } } } } |
OVER!
Android手机上监听短信的两种方式的更多相关文章
- Android之发送短信的两种方式
SMS涉及的主要类SmsManager 实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员. 公有方法: ArrayList< ...
- (转)Android之发送短信的两种方式
https://www.cnblogs.com/dongweiq/p/4866022.html if(TextUtils.isEmpty(number)||TextUtils.isEmpty(cont ...
- android 发送短信的两种方式,以及接收报告和发送报告
android发送短信,以及接收报告和发送报告 android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下: 一.调起系统发短信功能 ...
- Android 监听wifi广播的两种方式
1.XML中声明 <receiver android:name=".NetworkConnectChangedReceiver" > <i ...
- android 监听短信数据库,制作短信控制工具,控制别人的手机!!(一)
序言:本程序示例本着简洁易懂的目的,只做了简单的功能实现,需要用户启动应用,收到短信才有效果.作者将会在后面的(二)篇中加入服务后台运行.自动启动功能,实现一个真正的短信控制工具.本文的目的很简单,让 ...
- Android 监听短信(同时监听广播和数据库)
暗扣,强烈谴责这种侵害用户利益的行为... 下面给大家介绍Android暗扣原理....... Android4.4以下的系统玩游戏就要小心了哈 暗扣方式之一:短信订购,即监听--------拦截- ...
- android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人
要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...
- android 监听短信并发送到服务器
1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. 2. 应用观察者模式,监听短信数据库,操作短信内容. 实例如下: SystemE ...
- 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电
Activity public class MainActivity extends ListActivity { private TextView tv_info; private ...
随机推荐
- MTU of IPV4 and IPV6
通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接 ...
- JVM笔记5:Class文件结构
Class文件是一组以8位字节为基础单位的二进制流,包含多个数据项目(数据项目的顺序,占用的字节数均由规范定义),各个数据项目严格按照顺序紧凑的排列在Class文件中,不包含任何分隔符,使得整个Cla ...
- 黑色遮罩引导蒙版 CSS实现方式
一.微云的实现 网站有一些改动的时候,为了让用户熟知新的操作位置,往往会增加一个引导,常见的方式就是使用一个黑色的半透明蒙版,然后需要关注的区域是镂空的. 然后上周五我去微云转悠的时候,也看到了引导层 ...
- Double跟double
Double 是类 double是基础数据类型.Double类型是double的包装类,在JDK1.5以后,二者可以直接相互赋值,称为自动拆箱和自动装箱.看你的提示,我推测你的jdk版本在1.5以前. ...
- VS 2013 Chrome PPAPI 开发环境
当前系统版本为 Windows 8.1 x64, Chrome 版本为 50.0 1. 准备工作 下载并安装 Python https://www.python.org/download/ * 必须使 ...
- .NET笔记系列:LAMBDA表达式常用写法
这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下: 1.select语句:books.Select ...
- Java NIO 选择器(Selector)的内部实现(poll epoll)
http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java NI ...
- SQL 查找存储过程及视图与自带函数
查找所有所有存储过程的名称及信息select * from sysobjectswhere type='P' 查看存储过程定义语句sp_helptext [存储过程名] 查看所有视图及信息select ...
- struts2基于Convention插件的约定映射使用
一.首先说明一点:所谓的基于Convention插件的约定优于配置的使用,并不是严格意义上的零配置,struts.xml文件并不能完全舍弃. 获得Convention插件功能,所必需的jar包有:|a ...
- JQuery AJAX介绍
new ActiveXObject("Microsoft.XMLHTTP")是IE中创建XMLHttpRequest对象的方法.非IE浏览器中创建方法是new XmlHttpReq ...