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 代码片段整理
  3. Android--遍历SQLite数据库下的所有表名
  4. android带图片的AlertDialog和文件管理器(代码)
  5. android 用代码画虚线边框背景
  6. 在eclipse中查看Android SDK源代码
  7. Android 对话框【Dialog】去除白色边框代码

随机推荐

  1. Android 保存图片到SQLite
  2. Android中自带的RSA加密算法和JAVA中的区
  3. Android编程学习之抽象类AbsListView用法
  4. android 如何得到手机的信息..
  5. Android 中注解的使用
  6. Android 将图片转化为缩略图再加载
  7. Android(安卓)后台线程弹对话框导致程序
  8. 用Android自带的signapk.jar + .x509.pem
  9. Android 图片平铺效果bitmap
  10. Android webview listview 判断到底