目录
一、申请权限
二、ConsumerIrManager(消费者红外管理器)
三、判断是否有红外功能
四、发射红外信号
1.准备用于发射的信息
2.消费者红外管理器发射信息
五、案例代码一览
红外遥控是一种近红外光线(频率为几万赫兹)作为遥控光源的遥控方式。
在Android4.4后提供了红外遥控功能,部分手机未提供该功能,该功能由ConsumerIrManager(消费者红外管理器)控制。
一、申请权限
需要申请发射红外权限,该权限无需动态申请,仅在清单文件中声明即可。
<!--发射红外权限,无需动态申请-->
<uses-permission android:name="android.permission.TRANSMIT_IR"/>
二、ConsumerIrManager(消费者红外管理器)
ConsumerIrManager(消费者红外管理器)通过getSystemService()方法获取,用于控制红外发射功能。
常用方法如下:
- hasIrEmitter(发射器):检查设备是否拥有红外发射器。有返回true,没有返回false。
- getCarrierFrequencies(载体频率):获取可用的载波频率范围。手机的载波频率比较固定,大都处在30kHz到56kHz之间。
- transmit:发射红外信号。第一个参数为信号频率,单位赫兹(Hz),家用电器的红外频率通常使用38000Hz;第二个参数为整型数组形式的信号格式。
三、判断是否有红外功能
使用ConsumerIrManager的hasIrEmitter方法判断设备是否有红外功能。
//获取消费者红外管理器
ConsumerIrManager consumerIrManager= (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);
//判断是否有红外发射器
if(consumerIrManager.hasIrEmitter()){textView.setText("该设备有红外发射器");
}
else {textView.setText("该设备无红外发射器");
}
四、发射红外信号
使用ConsumerIrManager的transmit方法发射红外信息。
1.准备用于发射的信息
红外信号由三部分组成,分别是用户码、数据码、电路。其中用户码表示厂商代号,每个厂家都有自己的唯一代号;数据码表示按键的编号,不同的数据码代表不同的按键;电路格式表示红外信号的编码协议,每种协议都有专门的指令格式。比如说电路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
};
2.消费者红外管理器发射信息
//发射,普通家电红外频率一般为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){//发射,普通家电红外频率一般为38kHzconsumerIrManager.transmit(38000,pattern);}}});}
}
tag:红外线,红外光源,红外遥控,红外信号,红外信息,ConsumerIrManager