我在运行Android 5.0的Galaxy S5上的红外发射器遇到问题。
在将其更新到5.0之前,我的应用程序可以在手机上正常运行,但是现在,我想管理的设备没有任何 react 。当我单击我的应用程序发送红外代码时,指示灯会闪烁以指示红外管理器已激活,并且可以通过连接到我的示波器的红外光电二极管接收信号。不幸的是,我得到的信号形状与应有的形状有很大不同。
我可以补充一点,在Android 4.4.2下的平板电脑上运行的相同代码仍然可以完美运行。
为了帮助回答我的问题,请提供我的代码示例:
private String commande="0000 0070 0000 0032 0080 003F 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 "
+ "0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 "
+ "0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 "
+ "0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0030 0010 0A98";
IRManager=(ConsumerIrManager)activité.getSystemService(Context.CONSUMER_IR_SERVICE);
code=commandConversion(commande);
IRManager.transmit(code.getFrequency(),code.getCodes());
private RemoteCommandeCode commandConversion(String command) {
List<String> list;
RemoteCommandeCode code;
int frequency;
list= new ArrayList<String>(Arrays.asList(command.split(" ")));
list.remove(0); // dummy
frequency = Integer.parseInt(liste.remove(0), 16); // frequency
list.remove(0); // seq1
list.remove(0); // seq2
code=new RemoteCommandeCode(list.size());
for (int i = 0; i < list.size(); i++) {
code.setCode(i,Integer.parseInt(list.get(i), 16));
}
frequency = (int) (1000000 / (frequency * 0.241246));
code.setFrequency(frequency);
return(code);
}
public class RemoteCommandeCode {
private int fréquence;
private int [] codes;
public RemoteCommandeCode(int nombreCodes){
codes=new int[nombreCodes];
}
public int getFrequency() {
return frequency;
}
public void setFrequency(int frequency) {
this.frequency = frequency;
}
public int [] getCodes() {
return codes;
}
public void setCodes(int [] codes) {
this.codes = codes;
}
public void setCode(int i,int code){
codes[i]=code;
}
}
如所要求的,用简单代码“0000 0070 0000 0003 0010 0020 0010 0020 0010 0020”发出的信号的图像,我进入了4.4.2:
在Android 5.0上:
最佳答案
此方法将解决所有Android版本的IR问题
/*
* preforms some calculations on the codesets we have in order to make them work with certain models of phone.
*
* HTC devices need formula 1
* Samsungs want formula 2
*
* Samsung Pre-4.4.3 want nothing, so just return the input data
*
*/
private static int[] string2dec(int[] irData, int frequency) {
int formula = shouldEquationRun();
//Should we run any computations on the irData?
if (formula != 0) {
for (int i = 0; i < irData.length; i++) {
if (formula == 1) {
irData[i] = irData[i] * (1000000/frequency);//the brackets should avoid an arithmetic overflow
} else if (formula == 2) {
irData[i] = (int) Math.ceil(irData[i] * 26.27272727272727); //this is the samsung formula as per http://developer.samsung.com/android/technical-docs/Workaround-to-solve-issues-with-the-ConsumerIrManager-in-Android-version-lower-than-4-4-3-KitKat
}
}
}
return irData;
}
/*
* This method figures out if we should be running the equation in string2dec,
* which is based on the type of device. Some need it to run in order to function, some need it NOT to run
*
* HTC needs it on (HTC One M8)
* Samsung needs occasionally a special formula, depending on the version
* Android 5.0+ need it on.
* Other devices DO NOT need anything special.
*/
private static int shouldEquationRun() {
//Some notes on what Build.X will return
//System.out.println(Build.MODEL); //One M8
//System.out.println(Build.MANUFACTURER); //htc
//System.out.println(Build.VERSION.SDK_INT); //19
//Samsung's way of finding out if their OS is too new to work without a formula:
//int lastIdx = Build.VERSION.RELEASE.lastIndexOf(".");
//System.out.println(Build.VERSION.RELEASE.substring(lastIdx+1)); //4
//handle HTC
if (Build.MANUFACTURER.equalsIgnoreCase("HTC")) {
return 1;
}
//handle Lollipop (Android 5.0.1 == SDK 21) / beyond
if (Build.VERSION.SDK_INT >= 21) {
return 1;
}
//handle Samsung PRE-Android 5
if (Build.MANUFACTURER.equalsIgnoreCase("SAMSUNG")) {
if (Build.VERSION.SDK_INT >= 19) {
int lastIdx = Build.VERSION.RELEASE.lastIndexOf(".");
int VERSION_MR = Integer.valueOf(Build.VERSION.RELEASE.substring(lastIdx + 1));
if (VERSION_MR < 3) {
// Before version of Android 4.4.2
//Note: NO formula here, not even the other one
return 0;
} else {
// Later version of Android 4.4.3
//run the special samsung formula here
return 2;
}
}
}
//if something else...
return 0;
}
*编辑:得益于OP的帮助,我得以弄清楚如何解决此问题。现在,此答案应该可以解决此问题。