ИК-излучатель и Android 5.0

Я столкнулся с проблемой с ИК-излучателем на моей Galaxy S5 под управлением Android 5.0.

До того, как я обновил его до версии 5.0, мое приложение отлично работало на моем телефоне, но теперь устройство, которое, как я полагаю, у меня получилось, не реагирует. Когда я нажимаю на свое приложение для отправки ИК-кода, светодиод мигает, указывая на то, что IR-менеджер активирован, и я могу получить сигнал с ИК-фотодиодом, подключенным к моей области видимости. К сожалению, форма сигнала, который я получаю, сильно отличается от того, что должно быть.

Могу добавить, что тот же самый код, который работает на моем планшете под 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 4.4.2

И на Android 5.0: Сигнал на Android 5.0

Solutions Collecting From Web of "ИК-излучатель и Android 5.0"

Этот метод исправит проблемы с IR для всех версий 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; } 

* Edit: Благодаря помощи OP я смог выяснить, как это исправить. Этот ответ должен теперь решить эту проблему.