Android 实现监听短信(同时监听广播和数据库)代码如下:

  1. 拦截广播
    package com.javen.sms.receiver;import java.text.SimpleDateFormat;import java.util.Date;import java.util.TimeZone;import com.javen.util.InterceptKeyKeeper;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.util.Log;import android.widget.Toast;public class SmsReceiver extends BroadcastReceiver {    private Context mContext;    public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";    public static final String SMS_DELIVER_ACTION = "android.provider.Telephony.SMS_DELIVER";    @Override    public void onReceive(Context context, Intent intent) {        this.mContext=context;        Toast.makeText(context, "接收短信执行了.....", Toast.LENGTH_LONG).show();        Log.e("SMSReceiver, isOrderedBroadcast()=", isOrderedBroadcast()+"");        Log.e("SmsReceiver onReceive...", "接收短信执行了......");        String action = intent.getAction();        if (SMS_RECEIVED_ACTION.equals(action) || SMS_DELIVER_ACTION.equals(action)) {            Toast.makeText(context, "开始接收短信.....", Toast.LENGTH_LONG).show();            Log.e("SmsReceiver onReceive...", "开始接收短信.....");                        Bundle bundle = intent.getExtras();            if (bundle != null) {                Object[] pdus = (Object[])bundle.get("pdus");                  if (pdus != null && pdus.length > 0) {                      SmsMessage[] messages = new SmsMessage[pdus.length];                      for (int i = 0; i < pdus.length; i++) {                          byte[] pdu = (byte[]) pdus[i];                          messages[i] = SmsMessage.createFromPdu(pdu);                      }                      for (SmsMessage message : messages) {                          String content = message.getMessageBody();// 得到短信内容                          String sender = message.getOriginatingAddress();// 得到发信息的号码                          if (content.contains(InterceptKeyKeeper.getInterceptKey(mContext))) {                            Toast.makeText(mContext, "内容为:"+content, Toast.LENGTH_LONG).show();                            //setResultData(null);                            this.abortBroadcast();// 中止                        }else if (sender.equals("10010") || sender.equals("10086")) {                            Toast.makeText(mContext, "内容为:"+content, Toast.LENGTH_LONG).show();                            this.abortBroadcast();// 中止                        }                        Date date = new Date(message.getTimestampMillis());                          SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");                        format.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));                        String sendContent = format.format(date) + ":" + sender + "--" + content;                          Log.e("SmsReceicer onReceive ",sendContent +" ");                    }                }            }        }    }}

     


  2. 开启一个服务开监听数据库
    package com.javen.service;import android.app.Service;import android.content.ContentResolver;import android.content.Intent;import android.net.Uri;import android.os.IBinder;import android.os.Process;import android.widget.Toast;/** * @author Javen * 开启一个服务开监听数据库 */public class SmsService extends Service {    private SmsObserver mObserver;    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public void onCreate() {        Toast.makeText(this, "SmsService 服务器启动了....", Toast.LENGTH_LONG).show();        // 在这里启动        ContentResolver resolver = getContentResolver();        mObserver = new SmsObserver(resolver, new SmsHandler(this));        resolver.registerContentObserver(Uri.parse("content://sms"), true,mObserver);    }    @Override    public void onDestroy() {        super.onDestroy();        this.getContentResolver().unregisterContentObserver(mObserver);        Process.killProcess(Process.myPid());    }}

     


  3. 数据库观察者
    package com.javen.service;import android.content.ContentResolver;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Message;import android.util.Log;/** * @author Javen * 数据库观察者 */public class SmsObserver extends ContentObserver {    private ContentResolver mResolver;    public SmsHandler smsHandler;    public SmsObserver(ContentResolver mResolver, SmsHandler handler) {        super(handler);        this.mResolver = mResolver;        this.smsHandler = handler;    }    @Override    public void onChange(boolean selfChange) {        Log.i("SmsObserver onChange ", "SmsObserver 短信有改变");        Cursor mCursor = mResolver.query(Uri.parse("content://sms/inbox"),                new String[] { "_id", "address", "read", "body", "thread_id" },                "read=?", new String[] { "0" }, "date desc");        if (mCursor == null) {            return;        } else {            while (mCursor.moveToNext()) {                SmsInfo _smsInfo = new SmsInfo();                int _inIndex = mCursor.getColumnIndex("_id");                if (_inIndex != -1) {                    _smsInfo._id = mCursor.getString(_inIndex);                }                int thread_idIndex = mCursor.getColumnIndex("thread_id");                if (thread_idIndex != -1) {                    _smsInfo.thread_id = mCursor.getString(thread_idIndex);                }                int addressIndex = mCursor.getColumnIndex("address");                if (addressIndex != -1) {                    _smsInfo.smsAddress = mCursor.getString(addressIndex);                }                int bodyIndex = mCursor.getColumnIndex("body");                if (bodyIndex != -1) {                    _smsInfo.smsBody = mCursor.getString(bodyIndex);                }                int readIndex = mCursor.getColumnIndex("read");                if (readIndex != -1) {                    _smsInfo.read = mCursor.getString(readIndex);                }                                // 根据你的拦截策略,判断是否不对短信进行操作;将短信设置为已读;将短信删除                // TODO                System.out.println("获取的短信内容为:"+_smsInfo.toString());                Log.i("SmsObserver ...", "获取的短信内容为:"+_smsInfo.toString());                Message msg = smsHandler.obtainMessage();                _smsInfo.action = 2;// 0不对短信进行操作;1将短信设置为已读;2将短信删除                msg.obj = _smsInfo;                smsHandler.sendMessage(msg);            }        }        if (mCursor != null) {            mCursor.close();            mCursor = null;        }    }}

     


  4. 短信处理类
    package com.javen.service;import android.content.ContentValues;import android.content.Context;import android.net.Uri;import android.os.Handler;import android.os.Message;/** * @author Javen *  *         短信的处理 *  */public class SmsHandler extends Handler {    private Context mcontext;    public SmsHandler(Context context) {        this.mcontext = context;    }    @Override    public void handleMessage(Message msg) {        SmsInfo smsInfo = (SmsInfo) msg.obj;        if (smsInfo.action == 1) {            ContentValues values = new ContentValues();            values.put("read", "1");            mcontext.getContentResolver().update(                    Uri.parse("content://sms/inbox"), values, "thread_id=?",                    new String[] { smsInfo.thread_id });        } else if (smsInfo.action == 2) {            Uri mUri = Uri.parse("content://sms/");            mcontext.getContentResolver().delete(mUri, "_id=?",                    new String[] { smsInfo._id });        }    }}

     


  5. SmsInfo 数据结构 主要用于短信拦截
    package com.javen.service;/** * 主要用于短信拦截 *  * @author Javen *  */public class SmsInfo {    public String _id = "";    public String thread_id = "";    public String smsAddress = "";    public String smsBody = "";    public String read = "";    public int action = 0;// 1代表设置为已读,2表示删除短信    @Override    public String toString() {        return "SmsInfo [_id=" + _id + ", thread_id=" + thread_id                + ", smsAddress=" + smsAddress + ", smsBody=" + smsBody                + ", read=" + read + ", action=" + action + "]";    }        }

     


  6. 需要的权限以及配置信息
    <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.javen.sms"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="21" />        <uses-permission android:name="android.permission.SEND_SMS" />      <uses-permission android:name="android.permission.RECEIVE_SMS" />              <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        >        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            intent-filter>        activity>                 <receiver            android:name="com.javen.sms.receiver.SmsReceiver"            android:exported="true"            android:permission="android.permission.BROADCAST_SMS">            <intent-filter android:priority="2147483647" >                <action android:name="android.provider.Telephony.SMS_RECEIVED" />                <action android:name="android.provider.Telephony.SMS_DELIVER" />                <category android:name="android.intent.category.DEFAULT" />             intent-filter>        receiver>                <service android:name="com.javen.service.SmsService">service>    application>manifest>

     

  7. 测试在MainActivity 中启动SmsService  发送短信到10086 或者10010即可测试

     

            intentService = new Intent(this, SmsService.class);        startService(intentService);        Toast.makeText(this, "启动service中.....", 1).show();


转载自:http://www.cnblogs.com/zyw-205520/p/4764177.html

更多相关文章

  1. Android单选和多选择按钮:
  2. [Android]Accessibility Service的知识点
  3. android 程序日志记录
  4. android实现回车键的监听
  5. Android(安卓)短信发送器
  6. Android(安卓)抽屉导航
  7. android监听网络变化
  8. android事件分发机制总结
  9. Android中的一些开关

随机推荐

  1. android 中系统自带的主题与样式(theme a
  2. Android的设计模式-模板方法模式
  3. android中自带的主题(theme)的集
  4. Android的设计模式-工厂方法模式
  5. Android的设计模式-建造者模式
  6. Android的设计模式-策略模式
  7. Android的设计模式-简单工厂模式
  8. Android(安卓)主配置文件
  9. Android的设计模式-组合模式
  10. 《阿里巴巴 Android(安卓)开发手册》(一)