Emisor IR y Android 5.0

Estoy enfrentando un problema con el emisor de IR en mi Galaxy S5 corriendo bajo Android 5.0.

Antes de actualizarlo a 5.0, mi aplicación funcionaba perfectamente en mi teléfono, pero ahora, el dispositivo que debo administrar no tiene ninguna reacción. Cuando hago clic en mi aplicación para enviar un código IR, el led parpadea para indicar que el administrador IR está activado y puedo recibir una señal con un fotodiodo IR conectado a mi scope. Desafortunadamente, la forma de la señal que recibo es muy diferente de lo que debería ser.

Puedo agregar que el mismo código que se ejecuta en mi tableta con Android 4.4.2 todavía funciona perfectamente.

Para ayudar a responder mi pregunta, una muestra de mi código:

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 list; RemoteCommandeCode code; int frequency; list= new ArrayList(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; } } 

Según lo pedido, las imágenes de la señal emitida con el código simple “0000 0070 0000 0003 0010 0020 0010 0020 0010 0020”, obtengo en 4.4.2: Señal en Android 4.4.2

y en Android 5.0: Señal en Android 5.0

Este método solucionará los problemas de IR para todas las versiones de Android

 /* * 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; } 

* Editar: Gracias a la ayuda de OP, pude resolver cómo solucionar esto. Esta respuesta ahora debería resolver este problema.