Android中监听短信的两种方法

时间:2021-09-09 06:54:02

1、监听广播

缺点,因为优先级的原因可能接收不到。

代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
public static final String TAG = "ImiChatSMSReceiver";
 
  public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
 
  public void onReceive(Context context, Intent intent)
  {
    if (intent.getAction().equals(SMS_RECEIVED_ACTION))
    {
      SmsMessage[] messages = getMessagesFromIntent(intent);
 
      for (SmsMessage message : messages)
      {
 
        String text = message.getOriginatingAddress() + " : " +
 
        message.getDisplayOriginatingAddress() + " : " +
 
        message.getDisplayMessageBody() + " : " +
 
        message.getTimestampMillis();
 
        String num = message.getOriginatingAddress();
        Log.i(TAG, "-------------" + text);
        Toast.makeText(context, text, Toast.LENGTH_LONG).show();
        sendMessage(num, "来自" + num + "的短信已经收到", context);
 
        context.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, new SmsObserver(new Handler(), context));
      }
    }
  }
 
  public void sendMessage(String num, String text, Context context)
  {
    SmsManager smsManager = SmsManager.getDefault();
    PendingIntent sentIntent = PendingIntent.getBroadcast(context, 0, new Intent(), 0);
    String strContent = text;
 
    smsManager.sendTextMessage(num, null, strContent, sentIntent, null);
 
    TelephonyManager tl = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    int itype = tl.getPhoneType();
    Log.i(TAG, "-------------" + "当前卡类型为:" + itype);
    if (itype == TelephonyManager.PHONE_TYPE_GSM)
    {
      Toast.makeText(context, "当前卡类型为:GSM", Toast.LENGTH_LONG).show();
    }
    else if (itype == TelephonyManager.PHONE_TYPE_CDMA)
    {
      Toast.makeText(context, "当前卡类型为 : CDMA", Toast.LENGTH_LONG).show();
    }
    else if (itype == TelephonyManager.PHONE_TYPE_NONE)
    {
      Toast.makeText(context, "当前卡类型为:NONE", Toast.LENGTH_LONG).show();
    }
  }
 
  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、采用观察方法,监听短信数据库

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class SmsObserver extends ContentObserver
{
 
  private Context mContext;
 
  public SmsObserver(Handler handler , Context context)
  {
    super(handler);
    mContext = context;
  }
  
  public void onChange(boolean selfChange)
  {
    super.onChange(selfChange);
    Cursor cursor =null;
    try
    {
      //读取收件箱中的短信
      cursor = mContext.getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, "date desc");
      String body;
      boolean hasDone =false;
      if (cursor !=null)
      {
        while (cursor.moveToNext())
        {
          body = cursor.getString(cursor.getColumnIndex("body"));
          if(body !=null)//&& body.equals("【startMyActivity】"
          {
            hasDone =true;
            break;
          }
          if (hasDone)
          {
            break;
          }
        }
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    finally
    {
      if(cursor!=null)    cursor.close();
    }
  }
 
}

 

用到的权限:

?
1
2
3
<uses-permission android:name="android.permission.SEND_SMS" />
  <uses-permission android:name="android.permission.RECEIVE_SMS" />
  <uses-permission android:name="android.permission.READ_SMS" />