之前對Android系統下的簡訊資料庫做了一些簡單的分析,也寫了一些簡單的代碼來操作Android系統下的簡訊資料庫,具體見:
Android簡訊資料庫簡析讀取Android簡訊
其實,Android系統下,對簡訊的操作並不僅限於操作android簡訊資料庫,我們還可以攔截Android接收到的簡訊,或者攔截手機發出的簡訊。
Android系統把廣播機制用得出神入化,簡訊這塊也不例外,當Android手機接收到外來簡訊時,會向系統發送一個廣播,當然,這個廣播在被系統接收到之前,是可以被我們進行攔截的:
Android系統接收簡訊的廣播是:android.provider.Telephony.SMS_RECEIVED
我們只要接收到這個廣播,提取其中的簡訊資訊,便可實現攔截外來簡訊的功能:提取的資訊中包括了傳送簡訊者的電話號碼和簡訊的完整文本資訊,所以,當我們攔截到Android系統的簡訊後,可以根據不同的號碼做不同的處理,也可以跟據不同的簡訊內容做不同的處理:例如將特定號碼的簡訊存入受密碼保護的資料庫,將簡訊中含有特定詞語的簡訊存入指定資料庫等等,這樣就可以實現手機簡訊的隱私保護功能,當然也可用來攔截垃圾簡訊,來接騷擾簡訊等等……
其實,實現這些功能是很簡單的,我們只需要在程式的AndroidManifest.xml中註冊一個Receiver,將其與系統簡訊接收廣播:android.provider.Telephony.SMS_RECEIVED關聯起來,然後在Receiver中讀取簡訊內容即可,當然,不要忘了在AndroidManifest.xml中給許可權:
一些常用的許可權有下面這些,不過多介紹了,大致一看便知功能:
<uses-permission android:name="android.permission.READ_CONTACTS" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_SMS" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_SMS" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE" >
</uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS" >
</uses-permission>
<uses-permission android:name="android.permission.SEND_SMS" >
</uses-permission>
接收簡訊的Receiver註冊過程如下:
<receiver android:name="com.contact.main.receiver.IncommingSMSReceiver" >
<intent-filter android:priority="10000" >
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
接下來便是對接受到廣播後的處理了,運行過程中所截下的簡訊Log如:
原始碼如下:
package com.contact.main.receiver;
import com.contact.main.util.DateUtils;
import com.contact.main.util.Log;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class IncommingSMSReceiver extends BroadcastReceiver {
public static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
private String TAG = IncommingSMSReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_SMS_RECEIVED.equals(action)) {
handReceivedSMS(context, intent);
}
Log.d(TAG, "sms in");
}
private boolean handReceivedSMS(Context context, Intent intent) {
boolean result = false;
final SmsMessage[] msgs = getMessages(intent);
if (null != msgs) {
for (SmsMessage smsMessage : msgs) {
handleSmsMessage(context, smsMessage);
}
}
return result;
}
private final static SmsMessage[] getMessages(final Intent intent) {
final Bundle bundle = intent.getExtras();
SmsMessage[] msgs = new SmsMessage[] {};
if (null != bundle) {
msgs = getMessagesFromIntent(intent);
}
return msgs;
}
public static SmsMessage[] getMessagesFromIntent(final Intent intent) {
final Object[] messages = (Object[])intent.getSerializableExtra("pdus");
final byte[][] pduObjs = new byte[messages.length][];
for (int i = 0; i < messages.length; i++) {
pduObjs[i] = (byte[])messages[i];
}
final byte[][] pdus = new byte[pduObjs.length][];
final int pduCount = pdus.length;
final SmsMessage[] msgs = new SmsMessage[pduCount];
for (int i = 0; i < pduCount; i++) {
pdus[i] = pduObjs[i];
msgs[i] = SmsMessage.createFromPdu(pdus[i]);
}
return msgs;
}
private void handleSmsMessage(Context context, SmsMessage msg) {
final String number = msg.getOriginatingAddress();
final String smsContent = msg.getDisplayMessageBody();
long date = System.currentTimeMillis();
String mdate[] = DateUtils.convertDate(date);
Log.d(TAG,
"—————-" + "\n"
+ "Number:" + number + "\n"
+ "Content:" + smsContent + "\n"
+ "Time:" + mdate[0] + "–" + mdate[1] + "\n"
+ "—————-");
}
原文地址:http://www.cppcode.com/archives/2012/03/31/257.html