Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IR emitter and Android 5.0

I am facing a problem with the IR emitter on my Galaxy S5 running under Android 5.0.

Before I updated it to 5.0, my app was perfectly working on my phone but now, the device I am suppose to manage has no reaction. When I click on my app to send an IR code, the led blinks to indicate that the IR manager is activated and I can receive a signal with a IR photodiode connected to my scope. Unfortunately, the shape of the signal I get is very different from what it should be.

I can add that the same code running on my tablet under Android 4.4.2 still works perfectly.

To help in answering my question, a sample of my code :

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

As asked, images of the signal emitted with the simple code "0000 0070 0000 0003 0010 0020 0010 0020 0010 0020", I get on 4.4.2 : Signal on Android 4.4.2

and on Android 5.0 : Signal on Android 5.0

like image 368
VD63 Avatar asked Mar 01 '15 14:03

VD63


People also ask

How do I enable IR on my Android?

You can tap Open to launch the app from the Play Store or tap its icon on the app drawer. Select your IR blaster when prompted. The app should ask you to choose your IR blaster the first time you open it. Follow the on-screen instructions to select it and/or grand appropriate permissions.

Does my phone have IR capabilities?

Consult Phone Manual Consult or check your smartphone manual and read the specifications section of it. The IR Blaster or Infrared port will be mentioned there if your phone has this feature. If there is no mention of Infrared port then your phone does not possess this feature.


1 Answers

This method will fix the IR problems for all Android versions

/*
 * 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: Thanks to the OP's help, I was able to figure out how to fix this. This answer should now solve this problem.

like image 144
Dwebtron Avatar answered Nov 14 '22 22:11

Dwebtron