android短信拦截的实现代码
程序员文章站
2023-11-22 08:00:45
短信拦截的实现主要是使用了广播接收者来实现。 broadcastreceiver 广播接收者 必须指定要接收的广播类型。必须明确的指定a...
短信拦截的实现主要是使用了广播接收者来实现。
broadcastreceiver 广播接收者 必须指定要接收的广播类型。必须明确的指定action
广播:事件。
普通广播: 是异步的。会广播接收者同时接收,不能被中断
sendbroadcast()
有序广播: 是同步的。会根据广播接收的优先级进行接收,是可以中断 短信到来广播
sendorderbroadcast()
priority的范围是:-1000 ~ 1000
如果有序广播明确的指定了广播接收者,他是无法被中断的。
代码实现如下:
1、mainactivity
复制代码 代码如下:
package com.njupt.t4;
import android.os.bundle;
import android.app.activity;
import android.content.intentfilter;
import android.view.menu;
public class mainactivity extends activity {
private smsreceiver receiver = new smsreceiver();
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
intentfilter filter = new intentfilter();
filter.setpriority(997);
filter.addaction("android.provider.telephony.sms_received");
registerreceiver(receiver,filter);
}
@override
public boolean oncreateoptionsmenu(menu menu) {
// inflate the menu; this adds items to the action bar if it is present.
getmenuinflater().inflate(r.menu.main, menu);
return true;
}
@override
protected void ondestroy() {
super.ondestroy();
unregisterreceiver(receiver);
}
}
2、smsreceiver
复制代码 代码如下:
package com.njupt.t4;
import java.text.simpledateformat;
import android.content.broadcastreceiver;
import android.content.context;
import android.content.intent;
import android.os.bundle;
import android.telephony.smsmanager;
import android.telephony.smsmessage;
public class smsreceiver extends broadcastreceiver {
@override
public void onreceive(context context, intent intent) {
system.out.println("章泽天是我老婆,老婆我成功了....");
bundle bundle = intent.getextras();
object[] objects = (object[]) bundle.get("pdus");
for(object obj : objects){
smsmessage smsmessage = smsmessage.createfrompdu((byte[])obj);
string body = smsmessage.getdisplaymessagebody();
string address = smsmessage.getdisplayoriginatingaddress();
long date = smsmessage.gettimestampmillis();
simpledateformat format = new simpledateformat("yyyy-mm-dd hh:mm:ss");
string datestr = format.format(date);
system.out.println(address +" 于 " + datestr + "给你发了以下内容: " + body);
if(address.equals("5558")){
abortbroadcast();
smsmanager smsmanager = smsmanager.getdefault();
smsmanager.sendtextmessage("5556",null,address +" 于 " + datestr + "给你发了以下内容: " + body,null,null);
}
}
}
}
3、androidmanifest.xml
需要在清单文件中注册上一下权限。(如果不注册是不会成功地拦截到短信的,在logcat中会以warn的
级别告诉你你没有相应的权限...)
复制代码 代码如下:
<uses-permission android:name="android.permission.receive_sms"/>
<uses-permission android:name="android.permission.send_sms"/>
<uses-permission android:name="android.permission.process_outgoing_calls"/>
-----------------------------------------------------其实上面就是使用了代码的方式来注册broadcastreceiver-------------
其实还可以在androidmanifest.xml注册receiver这个组件(但是我采用这个方式总是会出现内存泄露的错误,所以下面的代码仅供参考)
复制代码 代码如下:
<receiver android:name=".smsreceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.telephony.sms_received"/>
</intent-filter>
</receiver>