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" />          <!-- <uses-permission android:name="android.permission.BROADCAST_SMS" />     <uses-permission android:name="android.permission.READ_SMS" />    <uses-permission android:name="android.permission.WRITE_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(安卓)fragment中如何对listview添加监听事件
  2. Android(安卓)判断软键盘的状态(显示,隐藏)
  3. Android用Apache HttpClient 实现POST和Get请求
  4. android监听网络变化
  5. 使用Toast(android中的一种提醒方式) & 建立监听 --4
  6. android 监听方法
  7. Android(安卓)监听音量加减
  8. ANDROID 使用 Service 在手机锁屏休眠状态下后台执行发送短信息
  9. android手势滑动——左右滑动效果实现

随机推荐

  1. EditText的属性!
  2. Android的ProgressBar自定义入门
  3. Android(安卓)MapView 申请apiKey
  4. Android中文API (109) —— SimpleCursor
  5. android应用商店完整版源码
  6. View类的XML属性、相关方法及说明
  7. Android中的自动朗读(TTS)
  8. Android(安卓)UndoBar介绍
  9. android Sqlite多线程访问异常解决方案
  10. android的style控制Theme