【转】Android手机上监听短信的两种方式

来源:互联网 发布:网络上的v是什么意思 编辑:程序博客网 时间:2024/05/18 00:05
1、 接受系统的短信广播,操作短信内容。

优点:操作方便,适合简单的短信应用。
缺点:来信会在状态栏显示通知信息。

AndroidManifest.xml:
  1. <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
  2. <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

  3. <!-- Receiver -->
  4. <receiver android:name=".sms.SMSReceiver">
  5. <intent-filter>
  6.     <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  7. </intent-filter>
  8. </receiver>
复制代码
code:
  1. package org.anymobile.demo.sms;

  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.telephony.gsm.SmsMessage;
  6. import android.util.Log;

  7. public class SMSReceiver extends BroadcastReceiver
  8. {
  9.     public static final String TAG = "ImiChatSMSReceiver";
  10.     //android.provider.Telephony.Sms.Intents
  11.     public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
  12.    
  13.     @Override
  14.     public void onReceive(Context context, Intent intent)
  15.     {
  16.        if (intent.getAction().equals(SMS_RECEIVED_ACTION))
  17.        {
  18.            SmsMessage[] messages = getMessagesFromIntent(intent);
  19.            for (SmsMessage message : messages)
  20.            {
  21.               Log.i(TAG, message.getOriginatingAddress() + " : " +
  22.                   message.getDisplayOriginatingAddress() + " : " +
  23.                   message.getDisplayMessageBody() + " : " +
  24.                   message.getTimestampMillis());
  25.            }
  26.        }
  27.     }
  28.    
  29.     public final SmsMessage[] getMessagesFromIntent(Intent intent)
  30.     {
  31.         Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
  32.         byte[][] pduObjs = new byte[messages.length][];

  33.         for (int i = 0; i < messages.length; i++)
  34.         {
  35.             pduObjs[i] = (byte[]) messages[i];
  36.         }
  37.         byte[][] pdus = new byte[pduObjs.length][];
  38.         int pduCount = pdus.length;
  39.         SmsMessage[] msgs = new SmsMessage[pduCount];
  40.         for (int i = 0; i < pduCount; i++)
  41.         {
  42.             pdus[i] = pduObjs[i];
  43.             msgs[i] = SmsMessage.createFromPdu(pdus[i]);
  44.         }
  45.         return msgs;
  46.     }

  47. }
复制代码
2、 应用观察者模式,监听短信数据库,操作短信内容。 优点:可以拦截来信在状态栏的显示通知,适合作短信拦截。缺点:可以发展成MU,在后台悄悄的收/发短信。 实例如下:SystemEventReceiver:收到开机启动OK的广播后,启动BootService服务;收到应用发送短信的INTENT后,调用系统接口发送短信BootService:开启服务后,打开短信监听器SMSObserver:数据观察者,监听短信数据库SMSHandler:短信处理器 AndroidManifest.xml:
  1. <uses-permission android:name="android.permission.READ_SMS"></uses-permission>
  2. <uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>
  3. <!-- Service -->
  4. <service android:name=".BootService"
  5.         android:label="@string/app_name">
  6.     <intent-filter>
  7.                 <action android:name="org.anymobile.test.service.IMICHAT" />
  8.     <category android:name="android.intent.category.DEFAULT" />
  9. </intent-filter>
  10. </service>
  11. <!-- Receiver -->
  12. <receiver android:name=".SystemEventReceiver">
  13. <intent-filter>
  14.     <action android:name="android.intent.action.BOOT_COMPLETED" />
  15. </intent-filter>
  16. </receiver>
复制代码
code:
  1. package org.anymobile.demo.sms;

  2. import android.content.ContentUris;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.net.Uri;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. import android.util.Log;

  9. public class SMSHandler extends Handler
  10. {
  11.     public static final String TAG = "SMSHandler";

  12.     private Context mContext;
  13.    
  14.     public SMSHandler(Context context)
  15.     {
  16.        super();
  17.        this.mContext = context;
  18.     }
  19.    
  20.     public void handleMessage(Message message)
  21.     {
  22.        Log.i(TAG, "handleMessage: " + message);
  23.       
  24.        MessageItem item = (MessageItem) message.obj;
  25.        //delete the sms
  26.        Uri uri = ContentUris.withAppendedId(SMS.CONTENT_URI, item.getId());
  27.        mContext.getContentResolver().delete(uri, null, null);
  28.        Log.i(TAG, "delete sms item: " + item);
  29.     }
  30. }
  31. package org.anymobile.demo.sms;

  32. import android.content.ContentResolver;
  33. import android.database.ContentObserver;
  34. import android.database.Cursor;
  35. import android.os.Handler;
  36. import android.os.Message;
  37. import android.util.Log;

  38. public class SMSObserver extends ContentObserver
  39. {
  40.     public static final String TAG = "SMSObserver";
  41.    
  42.     private static final String[] PROJECTION = new String[]
  43.     {
  44.     SMS._ID,//0
  45.         SMS.TYPE,//1
  46.         SMS.ADDRESS,//2
  47.         SMS.BODY,//3
  48.         SMS.DATE,//4
  49.         SMS.THREAD_ID,//5
  50.         SMS.READ,//6
  51.         SMS.PROTOCOL//7
  52.     };
  53.     private static final String SELECTION =
  54.     SMS._ID + " > %s" +
  55. //     " and " + SMS.PROTOCOL + " = null" +
  56. //     " or " + SMS.PROTOCOL + " = " + SMS.PROTOCOL_SMS + ")" +
  57.     " and (" + SMS.TYPE + " = " + SMS.MESSAGE_TYPE_INBOX +
  58.     " or " + SMS.TYPE + " = " + SMS.MESSAGE_TYPE_SENT + ")";
  59.    
  60.     private static final int COLUMN_INDEX_ID    = 0;
  61.     private static final int COLUMN_INDEX_TYPE = 1;
  62.     private static final int COLUMN_INDEX_PHONE = 2;
  63.     private static final int COLUMN_INDEX_BODY = 3;
  64.     private static final int COLUMN_INDEX_PROTOCOL = 7;

  65.     private static final int MAX_NUMS = 10;
  66.     private static int MAX_ID = 0;

  67.     private ContentResolver mResolver;
  68.     private Handler mHandler;
  69.    
  70.     public SMSObserver(ContentResolver contentResolver, Handler handler)
  71.     {
  72.        super(handler);
  73.       
  74.        this.mResolver = contentResolver;
  75.        this.mHandler = handler;
  76.     }

  77.     @Override
  78.     public void onChange(boolean selfChange)
  79.     {
  80.        Log.i(TAG, "onChange : " + selfChange + "; " + MAX_ID + "; " + SELECTION);
  81.        super.onChange(selfChange);
  82.       
  83.         Cursor cursor = mResolver.query(SMS.CONTENT_URI, PROJECTION,
  84.         String.format(SELECTION, MAX_ID), null, null);
  85.       
  86.         int id, type, protocol;
  87.         String phone, body;
  88.         Message message;
  89.         MessageItem item;
  90.       
  91.         int iter = 0;
  92.         boolean hasDone = false;
  93.       
  94.         while (cursor.moveToNext())
  95.         {
  96.         id = cursor.getInt(COLUMN_INDEX_ID);
  97.         type = cursor.getInt(COLUMN_INDEX_TYPE);
  98.         phone = cursor.getString(COLUMN_INDEX_PHONE);
  99.         body = cursor.getString(COLUMN_INDEX_BODY);
  100.         protocol = cursor.getInt(COLUMN_INDEX_PROTOCOL);
  101.          
  102.         if (hasDone)
  103.         {
  104.              MAX_ID = id;
  105.              break;
  106.         }
  107.         if (protocol == SMS.PROTOCOL_SMS && body != null && body.startsWith(SMS.FILTER))
  108.         {
  109.              hasDone = true;
  110.             
  111.             item = new MessageItem();
  112.             item.setId(id);
  113.             item.setType(type);
  114.             item.setPhone(phone);
  115.             item.setBody(body);
  116.             item.setProtocol(protocol);
  117.            
  118.             message = new Message();
  119.                message.obj = item;
  120.                mHandler.sendMessage(message);
  121.         }
  122.         else
  123.         {
  124.              if (id > MAX_ID) MAX_ID = id;
  125.         }
  126.         if (iter > MAX_NUMS) break;
  127.         iter ++;
  128.         }
  129.     }
  130. }

  131. package org.anymobile.demo.sms;

  132. import android.net.Uri;
  133. import android.provider.BaseColumns;

  134. public interface SMS extends BaseColumns
  135. {
  136.     public static final Uri CONTENT_URI = Uri.parse("content://sms");
  137.     public static final String FILTER = "!imichat";
  138.    
  139.     public static final String TYPE = "type";
  140.     public static final String THREAD_ID = "thread_id";
  141.     public static final String ADDRESS = "address";
  142.     public static final String PERSON_ID = "person";
  143.     public static final String DATE = "date";
  144.     public static final String READ = "read";
  145.     public static final String BODY = "body";
  146.     public static final String PROTOCOL = "protocol";

  147.     public static final int MESSAGE_TYPE_ALL    = 0;
  148.     public static final int MESSAGE_TYPE_INBOX = 1;
  149.     public static final int MESSAGE_TYPE_SENT   = 2;
  150.     public static final int MESSAGE_TYPE_DRAFT = 3;
  151.     public static final int MESSAGE_TYPE_OUTBOX = 4;
  152.     public static final int MESSAGE_TYPE_FAILED = 5; // for failed outgoing messages
  153.     public static final int MESSAGE_TYPE_QUEUED = 6; // for messages to send later
  154.    
  155.     public static final int PROTOCOL_SMS = 0;//SMS_PROTO
  156.     public static final int PROTOCOL_MMS = 1;//MMS_PROTO
  157. }

  158. package org.anymobile.demo.sms;

  159. public class MessageItem implements java.io.Serializable
  160. {
  161.     private static final long serialVersionUID = 1L;
  162.    
  163.     private int id;
  164.     private int type;
  165.     private int protocol;
  166.     private String phone;
  167.     private String body;
  168.    
  169.     public MessageItem()
  170.     {}

  171.     public int getId()
  172.     {
  173.        return id;
  174.     }

  175.     public void setId(int id)
  176.     {
  177.        this.id = id;
  178.     }

  179.     public int getType()
  180.     {
  181.        return type;
  182.     }

  183.     public void setType(int type)
  184.     {
  185.        this.type = type;
  186.     }

  187.     public int getProtocol()
  188.     {
  189.        return protocol;
  190.     }

  191.     public void setProtocol(int protocol)
  192.     {
  193.        this.protocol = protocol;
  194.     }

  195.     public String getPhone()
  196.     {
  197.        return phone;
  198.     }

  199.     public void setPhone(String phone)
  200.     {
  201.        this.phone = phone;
  202.     }

  203.     public String getBody()
  204.     {
  205.        return body;
  206.     }

  207.     public void setBody(String body)
  208.     {
  209.        this.body = body;
  210.     }
  211.    
  212.     public String toString()
  213.     {
  214.        return
  215.            "id = " + id + ";" +
  216.            "type = " + type + ";" +
  217.            "protocol = " + protocol + ";" +
  218.            "phone = " + phone + ";" +
  219.            "body = " + body;
  220.     }
  221. }
  222. package org.anymobile.demo;

  223. import android.app.Service;
  224. import android.content.ContentResolver;
  225. import android.content.Intent;
  226. import android.database.ContentObserver;
  227. import android.os.Handler;
  228. import android.os.IBinder;
  229. import android.os.Process;
  230. import android.util.Log;

  231. import org.anymobile.demo.sms.SMS;
  232. import org.anymobile.demo.sms.SMSHandler;
  233. import org.anymobile.demo.sms.SMSObserver;

  234. public class BootService extends Service
  235. {
  236.     public static final String TAG = "BootService";
  237.    
  238.     private ContentObserver mObserver;

  239.     private Handler mHandler = new Handler();
  240.    
  241.     @Override
  242.     public void onCreate()
  243.     {
  244.        Log.i(TAG, "onCreate().");
  245.        super.onCreate();
  246.       
  247.        addSMSObserver();
  248.     }
  249.    
  250.     public void addSMSObserver()
  251.     {
  252.        Log.i(TAG, "add a SMS observer. ");
  253.       
  254.        ContentResolver resolver = getContentResolver();
  255.       
  256.        Handler handler = new SMSHandler(this);
  257.        mObserver = new SMSObserver(resolver, handler);
  258.        resolver.registerContentObserver(SMS.CONTENT_URI, true, mObserver);
  259.     }

  260.     @Override
  261.     public IBinder onBind(Intent intent)
  262.     {
  263.        return null;
  264.     }

  265.     @Override
  266.     public void onDestroy()
  267.     {
  268.        Log.i(TAG, "onDestroy().");
  269.       
  270.         this.getContentResolver().unregisterContentObserver(mObserver);
  271.       
  272.        super.onDestroy();

  273.         Process.killProcess(Process.myPid());
  274.        System.exit(0);
  275.     }
  276. }

  277. package org.anymobile.demo;

  278. import android.content.BroadcastReceiver;
  279. import android.content.Context;
  280. import android.content.Intent;
  281. //import android.os.Handler;
  282. //import android.os.Message;
  283. import android.telephony.gsm.SmsManager;

  284. import org.anymobile.demo.sms.MessageItem;

  285. public class SystemEventReceiver extends BroadcastReceiver
  286. {
  287.     @Override
  288.     public void onReceive(Context context, Intent intent)
  289.     {
  290.        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
  291.        {
  292.            context.startService(new Intent(Globals.IMICHAT_SERVICE));
  293.        }
  294.        else if (intent.getAction().equals(Globals.ACTION_SEND_SMS))
  295.        {
  296.            MessageItem mItem =
  297.               (MessageItem) intent.getSerializableExtra(Globals.EXTRA_SMS_DATA);
  298.            if (mItem != null && mItem.getPhone() != null && mItem.getBody() != null)
  299.            {
  300.               SmsManager.getDefault()
  301.                   .sendTextMessage(mItem.getPhone(), null,
  302.                      mItem.getBody(), null, null);
  303. //            new Thread(mTasks).start();
  304.            }
  305.        }
  306.     }
  307. }
复制代码
OVER!
原创粉丝点击