Android学习开发笔记之一短信拦截Receiver

目的:实现Android短信拦截

目录结构

实现思想

         创建SMSReseiver继承BroadcastReceiver对短信接收进行监听,当手机接收到短信时,将发件人号码与指定的手机号进行比较,如果相同,则将短信广播中断并将短信内容存储在sd卡根目录下的sms.txt文件中;否则,不做任何处理。

         在XML文件中静态注册SMSReceiver,将优先级设为2147483647(int类型最大值,在Android官方文档中给的范围是-1000到1000,但实际并无此上限,设为最大int型可以使其优先响应)。

         同时在配置文件中声明所需要的信息接收和读写外存权限

实现源码

SMSReceiver.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.http.util.EncodingUtils;

import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

public class SMSReceiver extends BroadcastReceiver{

	private  boolean flag = false;
	private  String MsgTxt = "";
	@SuppressLint("SdCardPath")
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		//如果接收到短信则响应该广播
		if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
			//接收Intent对象当中的数据
			Bundle bundle = intent.getExtras();
			if(bundle != null){				
				Object[] pdusObj = (Object[])bundle.get("pdus");
				//创建一个SmsMessage类型的数组
				SmsMessage[] messages = new SmsMessage[pdusObj.length];
				
				for(int i = 0; i < pdusObj.length; i++){
					messages[i] = SmsMessage.createFromPdu((byte[])pdusObj[i]);
					//将短信发件人与短信内容放到MsgTxt中
					MsgTxt = MsgTxt + messages[i].getMessageBody(); 
					if(messages[i].getOriginatingAddress().equals("10001")){
						flag = true;
					}
				}
				//messages数组中每一个元素都可以获取到发件人号码,这个地方猜测是因为当短信内容太长时将短信分为多条存储
				MsgTxt =  messages[0].getOriginatingAddress() + " : " + MsgTxt + "\n";
				if(flag){
					//新建File对象
					File file = new File("/sdcard/" , "sms.txt");
					//文件输入输出流
					FileOutputStream out;
					FileInputStream in;
					//判断文件是否存在,如果不存在则创建新文件
				    if(!file.exists()){
				    	try {
							file.createNewFile();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
				    }
				    
					try {
						//若文件已存在,首先读取原有文件中的内容保存到old中,
						//然后将原有信息与新截取内容合并存放到sd卡根目录下的sms.txt文件中
						String old;
						in = new FileInputStream(file);
			            int length = (int)file.length();
			            byte[] temp = new byte[length];
			            in.read(temp, 0, length);
			            //将byte数组用UTF-8编码并存入display字符串中
			            old =  EncodingUtils.getString(temp,"UTF-8");
			            //关闭文件file的InputStream
			            in.close();
						out = new FileOutputStream(file);
						out.write((old + "\n" + MsgTxt).getBytes());
						out.close();
					} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					//中断广播
				    abortBroadcast();	
				}					
			}
		}
	}

}
AndroidManifest.xml
        <receiver android:name=".SMSReceiver">
            <intent-filter android:priority="2147483647">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>


    <uses-permission 
	    android:name="android.permission.RECEIVE_SMS" />    
    <uses-permission 
	    android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
下载链接:http://download.csdn.net/detail/zlyf1101/6485439

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值