今天做了一个利用广播机制的短信拦截器。 在我制作的拦截器中,设置拦截的方式有两种,一种是直接在.xml中设置拦截,另一种是通过手动注册来设计拦截。 这里我们需要通过查看文档找到一些短信发送和接收的权限。
下面我附上我做的拦截器的代码,供大家参考。
主要.xml:
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="注册拦截"
android:onClick="regiset"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="解注册拦截"
android:onClick="unregiset"
/>
首页显示:
package cn.yj3g.SmsListener;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class SmsListenerActivity extends Activity {
private SmsRecevier recevier;
private boolean isregiset = false;
private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
recevier = new SmsRecevier();
}
public void regiset(View v) {
IntentFilter filter = new IntentFilter(ACTION);
filter.setPriority(1000);//设置优先级最大
registerReceiver(recevier, filter);
isregiset = true;
Toast.makeText(this, "注册成功", 0).show();
}
public void unregiset(View v) {
if (recevier != null && isregiset) {
unregisterReceiver(recevier);
isregiset = false;
Toast.makeText(this, "解注册成功", 0).show();
} else
Toast.makeText(this, "尚未注册", 0).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (recevier != null && isregiset) {
unregisterReceiver(recevier);
isregiset = false;
Toast.makeText(this, "解注册成功", 0).show();
}
}
}
如果手动注册拦截,则无需在.xml 中设置。 然而,采用手动拦截设置并不能满足拦截器的需求。 这里我只是把广播机制解释的更清楚一些。
.xml:
package="cn.yj3g.SmsListener"
android:versionCode="1"
android:versionName="1.0">
android:label="@string/app_name">
该类用于拦截信息:
package cn.yj3g.SmsListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
public class SmsRecevier extends BroadcastReceiver {
public SmsRecevier() {
Log.v("TAG", "SmsRecevier create");
}
@Override
public void onReceive(Context context, Intent intent) {
Log.v("TAG", "SmsRecevier onReceive");
Object[] pdus = (Object[]) intent.getExtras().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 (sender.equals("110")) {
abortBroadcast();// 中止发送
Log.e("TAG", "此号码为黑名单号码,已拦截!");
}
Date date = new Date(message.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String sendContent = format.format(date) + ":" + sender + "--"
+ content;
SmsManager smsManager = SmsManager.getDefault();// 发信息时需要的
smsManager.sendTextMessage("5556", null, sendContent, null,
null);// 转发给5556
Log.v("TAG", sendContent);
}
}
}
}