一.短信拦截分为2种方式,其一是广播,其二是内容观察者

如何判断android 短信发送(sendTextMessage)是否成功


第一种是通过BroadcastReciver

<uses-permissionandroid:name="android.permission.RECEIVE_SMS"/><!--拦截短信(就是接受短些的权限)--><receiverandroid:name="com.demo.artshell.broadcastreceiverdemo.InterceptReceiver"><!--这里没有设置android:enable和android:exported属性,<ahref="http://developer.android.com/guide/topics/manifest/receiver-element.html"target="_blank"rel="nofollow">参考官方文档</a>--><!--这里的优先级为1000,假定你手机中没有安装其他第三方短信拦截软件,如360等,否则其他第三方软件拦截权限过高导致你都应用程序拦截不到短信--><intent-filterandroid:priority="1000"><actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver
importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.os.Bundle;importandroid.telephony.SmsMessage;importandroid.util.Log;importandroid.widget.Toast;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassInterceptReceiverextendsBroadcastReceiver{publicstaticfinalStringTAG="InterceptReceiver";publicstaticfinalStringACTION_SMS_RECEIVED="android.provider.Telephony.SMS_RECEIVED";publicInterceptReceiver(){}@OverridepublicvoidonReceive(Contextcontext,Intentintent){Log.i(TAG,"---------------InterceptReceiveronReceive()----------------");if(ACTION_SMS_RECEIVED.equals(intent.getAction())){BundlecarryContent=intent.getExtras();if(carryContent!=null){StringBuildersb=newStringBuilder();//通过pdus获取接收到的所有短信息,获取短信内容Object[]pdus=(Object[])carryContent.get("pdus");//构建短信对象数组SmsMessage[]mges=newSmsMessage[pdus.length];for(inti=0,len=pdus.length;i<len;i++){//获取单条短信内容,以pdu格式存,并生成短信对象mges[i]=SmsMessage.createFromPdu((byte[])pdus[i]);}for(SmsMessagemge:mges){sb.append("短信来自:").append(mge.getDisplayOriginatingAddress()).append("\n").append("短信内容:").append(mge.getMessageBody()).append("\n");DatesendDate=newDate(mge.getTimestampMillis());SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");sb.append("短信发送时间:").append(format.format(sendDate));}Log.i(TAG,sb.toString());//打印日志记录Toast.makeText(context,sb.toString(),Toast.LENGTH_LONG).show();this.abortBroadcast();//不再往下传播}}}}

第二种通过ContentObserver

content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱
content://sms/failed 发送失败
content://sms/queued 待发送列表


privateSmsObserversmsObserver;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.app_login);smsObserver=newSmsObserver(this,null);getContentResolver().registerContentObserver(SMS_INBOX,true,smsObserver);}protectedvoidonstop(){super.onstop();//必须解除注册,否则Activity不能销毁getContentResolver().unregisterContentObserver(smsObserver);}classSmsObserverextendsContentObserver{publicSmsObserver(Contextcontext,Handlerhandler){super(handler);}@OverridepublicvoidonChange(booleanselfChange){super.onChange(selfChange);//每当有新短信到来时,使用我们获取短消息的方法getSmsFromPhone();}}

查询数据库

privateUriSMS_INBOX=Uri.parse("content://sms/inbox");publicvoidgetSmsFromPhone(){ContentResolvercr=getContentResolver();String[]projection=newString[]{"body"};//"_id","address","person",,"date","typeStringwhere="address='1066321332'ANDdate>"+(System.currentTimeMillis()-10*60*1000);Cursorcur=cr.query(SMS_INBOX,projection,where,null,"datedesc");if(null==cur)return;if(cur.moveToNext()){Stringnumber=cur.getString(cur.getColumnIndex("address"));//手机号Stringname=cur.getString(cur.getColumnIndex("person"));//联系人姓名列表Stringbody=cur.getString(cur.getColumnIndex("body"));//这里我是要获取自己短信服务号码中的验证码~~Patternpattern=Pattern.compile("[a-zA-Z0-9]{10}");Matchermatcher=pattern.matcher(body);if(matcher.find()){Stringres=matcher.group().substring(1,11);mobileText.setText(res);}}}

sms主要结构:

_id:短信序号,如100    thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的    address:发件人地址,即手机号,如+86138138000    person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null    date:日期,long型,如1346988516,可以对日期显示格式进行设置    protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信    read:是否阅读0未读,1已读    status:短信状态-1接收,0complete,64pending,128failed    type:短信类型1是接收到的,2是已发出    body:短信具体内容    service_center:短信服务中心号码编号,如+8613800755500


Android4.4方案有些问题,看这里

如何在Android 4.4上实现短信拦截


------------------------------------------------

推荐博客:

http://my.csdn.net/L173864930

http://su1216.iteye.com/


二.电话来去电拦截

publicclassCallPhoneActivityextendsActivity{privateCallPhoneBroadcastReceivermBroadcastReceiver;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_call_phone);mBroadcastReceiver=newCallPhoneBroadcastReceiver();IntentFilterintentFilter=newIntentFilter();intentFilter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);//添加此Action来拦截来去电电话intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);//添加此Action来拦截来电电话状态registerReceiver(mBroadcastReceiver,intentFilter);}@OverrideprotectedvoidonDestroy(){//取消注册,防止内存溢出unregisterReceiver(mBroadcastReceiver);super.onDestroy();}publicclassCallPhoneBroadcastReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){AudioManagermAudioManager=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);StringinComingNumber=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);//去电StringoutGogingNumber=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);//来电StringphoneState=intent.getStringExtra(TelephonyManager.EXTRA_STATE);if(Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())){if(outGogingNumber==null){outGogingNumber=getResultData();}if(shouldCancel(outGogingNumber))//判断号码是不是需要拦截{mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);setResultData(null);mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);}else{setResultData(reformatNumber(outGogingNumber));}Log.i("TAG","去电号码:phoneState="+phoneState+",phoneNumber="+outGogingNumber);}elseif(!TextUtils.isEmpty(inComingNumber)&&TelephonyManager.EXTRA_STATE_RINGING.equals(phoneState)){//关于来电拦截,网上例子很多,如:http://blog.csdn.net/wangfayinn/article/details/8004023//注意TelephonyManager.EXTRA_STATE_RINGING.equals(phoneState)必须判断,否则来去电判断不准确Log.e("TAG","来电号码:inComingNumber="+phoneState+",phoneNumber="+inComingNumber);}}//拦截变更号码privateStringreformatNumber(StringphoneNumber){return"17951".concat(phoneNumber);}//判断该号码是否为危险号码privatebooleanshouldCancel(StringphoneNumber){return"13002248003".equals(phoneNumber);}}/***摸你去电*@paramv*/publicvoidonClickToCallPhone(Viewv){Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:13724551306"));startActivity(intent);}}

注意TelephonyManager.EXTRA_STATE_RINGING.equals(phoneState)必须判断,否则来去电判断不准确

权限

<!--呼出电话拦截--><uses-permissionandroid:name="android.permission.PROCESS_OUTGOING_CALLS"/><!--读取电话状态--><uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/><!--拨打电话--><uses-permissionandroid:name="android.permission.CALL_PHONE"/>


更多相关文章

  1. android短信发射器
  2. Android删除短信的方法
  3. Adnroid开发中ListView使用SimpleAdapter显示复杂列表的问题
  4. Android(安卓)实现获取双卡中的联系人
  5. android短信的接收和发送处理
  6. Android自动发送短信
  7. android-短信发送器
  8. Android(安卓)录音,加权限还有错误:java.lang.RuntimeException: s
  9. android 定时短信app之时间选择器(一)

随机推荐

  1. 华硕董座施崇棠漫谈笔电、平板、Netbook
  2. Android学习路线(十九)支持不同设备——支
  3. 【android】数字签名理解
  4. Android实现简单底部导航栏 Android仿微
  5. Android动态加载补充 加载SD卡中的SO库
  6. 创建可访问的Android应用程序:辅助技术
  7. 使用NDK编译Android所需的FFMPEG动态库
  8. Android进阶——Android控制端连接同一网
  9. [Android]转-Android 中的拿来主义(编译,
  10. android UI进阶之可延伸的图像