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, nullnull);

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_URIPROJECTION,

String.format(SELECTIONMAX_ID), nullnull);

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_IDMAX_ID = id;

}

if (iter > MAX_NUMSbreak;

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_URItrue,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手机上监听短信的两种方式的更多相关文章

  1. Android之发送短信的两种方式

    SMS涉及的主要类SmsManager 实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员. 公有方法: ArrayList< ...

  2. (转)Android之发送短信的两种方式

    https://www.cnblogs.com/dongweiq/p/4866022.html if(TextUtils.isEmpty(number)||TextUtils.isEmpty(cont ...

  3. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  4. Android 监听wifi广播的两种方式

    1.XML中声明 <receiver android:name=".NetworkConnectChangedReceiver" >             <i ...

  5. android 监听短信数据库,制作短信控制工具,控制别人的手机!!(一)

    序言:本程序示例本着简洁易懂的目的,只做了简单的功能实现,需要用户启动应用,收到短信才有效果.作者将会在后面的(二)篇中加入服务后台运行.自动启动功能,实现一个真正的短信控制工具.本文的目的很简单,让 ...

  6. Android 监听短信(同时监听广播和数据库)

    暗扣,强烈谴责这种侵害用户利益的行为... 下面给大家介绍Android暗扣原理.......  Android4.4以下的系统玩游戏就要小心了哈 暗扣方式之一:短信订购,即监听--------拦截- ...

  7. android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

    要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...

  8. android 监听短信并发送到服务器

    1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. 2. 应用观察者模式,监听短信数据库,操作短信内容.   实例如下: SystemE ...

  9. 内容观察者 ContentObserver 监听短信、通话记录数据库 挂断来电

    Activity public class MainActivity extends ListActivity {     private TextView tv_info;     private  ...

随机推荐

  1. MTU of IPV4 and IPV6

    通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接 ...

  2. JVM笔记5:Class文件结构

    Class文件是一组以8位字节为基础单位的二进制流,包含多个数据项目(数据项目的顺序,占用的字节数均由规范定义),各个数据项目严格按照顺序紧凑的排列在Class文件中,不包含任何分隔符,使得整个Cla ...

  3. 黑色遮罩引导蒙版 CSS实现方式

    一.微云的实现 网站有一些改动的时候,为了让用户熟知新的操作位置,往往会增加一个引导,常见的方式就是使用一个黑色的半透明蒙版,然后需要关注的区域是镂空的. 然后上周五我去微云转悠的时候,也看到了引导层 ...

  4. Double跟double

    Double 是类 double是基础数据类型.Double类型是double的包装类,在JDK1.5以后,二者可以直接相互赋值,称为自动拆箱和自动装箱.看你的提示,我推测你的jdk版本在1.5以前. ...

  5. VS 2013 Chrome PPAPI 开发环境

    当前系统版本为 Windows 8.1 x64, Chrome 版本为 50.0 1. 准备工作 下载并安装 Python https://www.python.org/download/ * 必须使 ...

  6. .NET笔记系列:LAMBDA表达式常用写法

    这里主要是将数据库中的常用操作用LAMBDA表达式重新表示了下,用法不多,但相对较常用,等有时间了还会扩展,并将查询语句及LINQ到时也一并重新整理下: 1.select语句:books.Select ...

  7. Java NIO 选择器(Selector)的内部实现(poll epoll)

    http://blog.csdn.net/hsuxu/article/details/9876983 之前强调这么多关于linux内核的poll及epoll,无非是想让大家先有个认识: Java NI ...

  8. SQL 查找存储过程及视图与自带函数

    查找所有所有存储过程的名称及信息select * from sysobjectswhere type='P' 查看存储过程定义语句sp_helptext [存储过程名] 查看所有视图及信息select ...

  9. struts2基于Convention插件的约定映射使用

    一.首先说明一点:所谓的基于Convention插件的约定优于配置的使用,并不是严格意义上的零配置,struts.xml文件并不能完全舍弃. 获得Convention插件功能,所必需的jar包有:|a ...

  10. JQuery AJAX介绍

    new ActiveXObject("Microsoft.XMLHTTP")是IE中创建XMLHttpRequest对象的方法.非IE浏览器中创建方法是new XmlHttpReq ...