赞
踩
目录
红外遥控是一种近红外光线(频率为几万赫兹)作为遥控光源的遥控方式。
在Android4.4后提供了红外遥控功能,部分手机未提供该功能,该功能由ConsumerIrManager(消费者红外管理器)控制。
需要申请发射红外权限,该权限无需动态申请,仅在清单文件中声明即可。
- <!--发射红外权限,无需动态申请-->
- <uses-permission android:name="android.permission.TRANSMIT_IR"/>
ConsumerIrManager(消费者红外管理器)通过getSystemService()方法获取,用于控制红外发射功能。
常用方法如下:
使用ConsumerIrManager的hasIrEmitter方法判断设备是否有红外功能。
- //获取消费者红外管理器
- ConsumerIrManager consumerIrManager= (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);
- //判断是否有红外发射器
- if(consumerIrManager.hasIrEmitter()){
- textView.setText("该设备有红外发射器");
- }
- else {
- textView.setText("该设备无红外发射器");
- }
使用ConsumerIrManager的transmit方法发射红外信息。
红外信号由三部分组成,分别是用户码、数据码、电路。其中用户码表示厂商代号,每个厂家都有自己的唯一代号;数据码表示按键的编号,不同的数据码代表不同的按键;电路格式表示红外信号的编码协议,每种协议都有专门的指令格式。比如说电路61212对应的是NEC6121协议,该协议的红外信号编码格式为:引导码+用户码+数据码+数据反码+结束码,其中引导码和结束码都是固定的,数据反码由数据码按位取反得来,真正变化的只有用户码和数据码。
然而解码仪获得的用户码和数据码并不能直接写在代码中,因为液晶屏上的编码其实是十六进制数,需要转换为二进制数才行。例如用户码4055,对应的二进制数为0100 0000 01010101;数据码44,对应的二进制数为0100 0100,按位取反得到数据反码的二进制数为1011 1011。可是transmit方法,参数要传递整型数组形式的信号,并不是二进制数,这意味着二进制数还得转换成整型数组。那么整型数组里面存放的到底是些什么数据呢?这就要从数字电路中的电平说起了。电平是“电压平台”的简称,指的是电路中某一点电压的高低状态,在数字电路中常用高电平表示“1”,用低电平表示“0”。遥控器发射红外信号之时,通过“560微秒低电平+1680微秒高电平”代表“1”,通过“560微秒低电平+560微秒低电平”代表“0”。于是编写Android代码的时候,使用“560,1680”表示二进制的1,使用“560,560”表示二进制的0,此处的560和1680只是大概的数值,也可使用580、600替换560,或者使用1600、1650替换1680。
- //准备发射信息
- int pattern[]={
- //开头两数字代表引导码
- 9000,4500,
- //下面两行表示用户码
- 560,560,560,1680,560,560,560,560,560,560,560,560,560,560,560,560,
- 560,560,560,1680,560,560,560,1680,560,560,560,1680,560,560,560,1680,
- //下面一行表示数据码
- 560,560,560,1680,560,560,560,560,560,560,560,1680,560,560,560,560,
- //下面一行表示数据反码
- 560,1680,560,560,560,1680,560,1680,560,1680,560,560,560,1680,560,1680,
- //末尾两个数字表示结束码
- 560,20000
- };
- //发射,普通家电红外频率一般为38kHz
- consumerIrManager.transmit(38000,pattern);
该界面由一个TextView与一个Button组成,使用前请在清单文件申请发射红外权限。
- public class MainActivity extends AppCompatActivity {
- private TextView textView=null;
- private Button button=null;
- private ConsumerIrManager consumerIrManager=null;
- //设备是否有红外发射器-标志
- private boolean hasIrEmitter=false;
- @SuppressLint("MissingInflatedId")
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //获取控件
- textView=findViewById(R.id.textView);
- button=findViewById(R.id.button);
- //获取消费者红外管理器
- consumerIrManager= (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);
- //判断是否有红外发射器
- if(consumerIrManager.hasIrEmitter()){
- textView.setText("该设备有红外发射器");
- hasIrEmitter=true;
- }
- else {
- textView.setText("该设备无红外发射器");
- }
- setIrEmitter();
- }
-
- /**
- * 设置button能发射数据
- */
- private void setIrEmitter(){
- //准备发射信息
- int pattern[]={
- //开头两数字代表引导码
- 9000,4500,
- //下面两行表示用户码
- 560,560,560,1680,560,560,560,560,560,560,560,560,560,560,560,560,
- 560,560,560,1680,560,560,560,1680,560,560,560,1680,560,560,560,1680,
- //下面一行表示数据码
- 560,560,560,1680,560,560,560,560,560,560,560,1680,560,560,560,560,
- //下面一行表示数据反码
- 560,1680,560,560,560,1680,560,1680,560,1680,560,560,560,1680,560,1680,
- //末尾两个数字表示结束码
- 560,20000
- };
-
- //设置发射按钮监听器
- button.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
-
- if(hasIrEmitter){
- //发射,普通家电红外频率一般为38kHz
- consumerIrManager.transmit(38000,pattern);
- }
-
- }
- });
- }
- }
tag:红外线,红外光源,红外遥控,红外信号,红外信息,ConsumerIrManager
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。