短信拦截的实现主要是使用了广播接收者来实现。
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>