广播接收者-BroadcastReceiver

本文介绍如何在Android应用中实现短信监听和外拨电话限制功能,包括使用广播接收者接收短信、解析短信内容并进行网络发送,以及通过修改拨号号码来限制拨打特定号码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

广播接收者-(BroadcastReceiver)用于接收广播Intent,

广播Intent的发送时通过调用 Context.sendBroadcast();Context.sendOrderedBroadcast()l实现的。

通常一个intent可以被订阅了此intent的多个广播接收者所接收,实现如下:

1.继承BroadcastReceiver 重写onReceive()方法;

2.订阅感兴趣的广播intent,

IntentFilter filter = new IntentFilter ("广播类型");

IncomingSMSReceiver receiver = new IncomingSMSReceiver();

registerReciver(receiver,filter ); //注册

3.普通广播 Normal broadcasts 完全异步,,可以被所有接收者接收到 ,缺点:不能将处理结果传递给下一个广播接收者

Context.sendBroadcast(new intent对象);

   有序广播 ordered broadcast   根据接收者声明的优先级别 依次接收 A-B-C-D...有序广播接收者可以终止广播传递

Context.sendOrderedBroadcast();

arg0:广播对象,广播意图

arg1:接收该广播的权限

arg2:必须接收该广播的接收者,拦截置空,达到不允许拨特定号码

arg3:hanndle,置空将在Context所在的主线程被调用

arg4:用于标识结果数据的结果码

arg5:为结果数据(拨号号码)

arg6:附加的广播额外数据


void android. content. Context.sendOrderedBroadcast( Intent arg0, String arg1, BroadcastReceiver arg2, Handler arg3, int arg4, String arg5, Bundle arg6)

终止广播-

abortBroadcast();

实例:广播接收者实现短信监听-BroadcastReceiver

原理:系统接收短信时,发送一个广播intent:android.provider.Telephony.SMS_RECEIVED;该intent包含短信内容,

   我们使用“pdus”接收intent中短信数据

package com.example.smslistener;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
/**
 * 广播接收者
 * @author Administrator
 *
 */
public class UnSortBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context arg0, Intent intent) { 
	        Log.e("Intent_Action:::",intent.getAction()+"");
	        Object[]  pdus = (Object[]) intent.getExtras().get("pdus");
	        for(Object obj:pdus){
	        	byte[] pdu = (byte[]) obj;
	        	SmsMessage message = SmsMessage.createFromPdu(pdu);
	        	String content = message.getMessageBody();
	        	Date date = new Date(message.getTimestampMillis());
	        	//YY-MM-dd HH:mm:ss
	        	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        	String receiverTime = format.format(date);
	        	//send number
	        	String sendNumber = message.getOriginatingAddress();
	        	//网络发送短信内容
	        	//sendSMS(content,receiverTime,sendNumber);
	        	System.out.println("sendNumber"+sendNumber);
	        	System.out.println("reciverTime:"+receiverTime);
	        	System.out.println("content:"+content);
	        }
	}

	/**
	 * 接收短信权限
	 * 访问网络权限
	 * <uses-permission android:name="android.permission.RECEIVE_SMS" />
     * <uses-permission android:name="android.permission.INTERNET"/>
	 * 
	 * @param content
	 * @param receiverTime
	 * @param sendNumber
	 * @return
	 */
	private boolean sendSMS(String content, String receiverTime, String sendNumber) {

		try{
		//2.2
		String params = "content = "+URLEncoder.encode(content,"UTF-8")+
						"&receivertime = "+receiverTime+
						"&sendnumber = "+sendNumber;
		byte[] entity = params.getBytes();
		//1.
		String path = "http://192.168.1.100:80/videonews/ReceiveSMSServlet";
		//2.1
		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;
	}
}

主配置文件

<receiver android:name=".UnSortBroadcastReceiver">
	<!-- priority权限等级 -1000-1000 -->
	<intent-filter android:priority="1000">
		<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
	</intent-filter>
</receiver>


-----------------------------外拨电话限制

package com.example.smslistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
 * 1.获取拨号广播-权限要求大于发送广播者权限
 * 2.修改拨号号码(加上亲情号-便宜)
 * 3.从新设置广播
 * @author Administrator
 *
 */
public class PhoneBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context arg0, Intent arg1) {
		String phoneNumber = getResultData();
		if("10086".equals(phoneNumber)){
			setResultData(null);
			//abortBroadcast();//sendOrderedBroadcast()发送广播时指定了拨号器接收者,这里不能抛弃
		}else{
			phoneNumber = "12593"+phoneNumber;
			setResultData(phoneNumber);
		}
	}
}









参考文章:http://blog.youkuaiyun.com/jiangwei0910410003/article/details/19150705

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值