title: HTC IR API Lollipop
body: <p>I am trying to get the infrared transmitter to work on the HTC ONE m8 after lollipop update. I am trying to use the HTC Sense IR SDK (addon-htc_ir_api-htc-19) found here: <a href="http://www.htcdev.com/devcenter/opensense-sdk/htc-ir-api" rel="nofollow">http://www.htcdev.com/devcenter/opensense-sdk/htc-ir-api</a> I import the sample project (HTCConsumerIR) and run the app on my HTC device and the app simply does not transmit a signal. I get no errors, but the infrared transmitter does not even turn on. This is the same project with no modifications at all. Why is it not working? Any help from someone who has infrared working on HTC would be much appropriated. It can get infrared working on every device except HTC's. </p>
  
  <p>Here is the code for the main class, if that helps at all:</p>
  
  <pre><code>      public class OneCIRActivity extends Activity {
  
      private final static String TAG = "OneCIR";
      private boolean running;
  
      ConsumerIrManagerCompat mCIR;
      Button btnLearn, btnSend, btnSendByIRManager, btnStart, btnStop;
      TextView textView;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_onecir);
  
          btnStart = (Button)findViewById(R.id.buttonstart);
          //        btnStart.setOnClickListener(btnStartListener); //HTC optional (see onResume())
          //        btnStart.setText("CIRControl.start");
          btnStart.setVisibility(View.GONE);
  
          btnLearn = (Button)findViewById(R.id.buttonlearn);
          btnLearn.setOnClickListener(btnLearnListener);
          btnLearn.setText("Learn IR"); //HTC
  
          btnSend = (Button)findViewById(R.id.buttonsend);
          btnSend.setOnClickListener(btnSendIRListener);
          btnSend.setText("Send IR"); //BOTH
  
          btnStop = (Button)findViewById(R.id.buttonstop);
          //        btnStop.setOnClickListener(btnStopListener); //HTC optional 
          //        btnStop.setText("CIRControl.stop");
          btnStop.setVisibility(View.GONE);
  
          textView = (TextView)findViewById(R.id.textview1);
  
          mCIR = ConsumerIrManagerCompat.createInstance(getApplicationContext());
  
          mCIR.start(); //for HTC - noop otherwise (also see onResume()/onPause() )
  
          mCIR.setTextView(textView); // to pass errors to UI
  
          updateUI();
      }
  
  
      public void updateUI() {
          if (mCIR != null) {
              if (mCIR.hasIrEmitter()) {
                      if((mCIR.supportedAPIs|ConsumerIrManagerCompat.HTCSUPPORT)!=0) {
                          btnLearn.setEnabled(true);
                      } else {
                          btnLearn.setEnabled(false);
                      }
                      btnSend.setEnabled(true);
              } else {
                  btnLearn.setEnabled(false);
                  btnSend.setEnabled(false);
              }
  
          }
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          //getMenuInflater().inflate(R.menu.activity_onecir, menu);
          return true;
      }
  
      private OnClickListener btnLearnListener = new OnClickListener() {
          public void onClick(View v) {
              //Use this HTC API to learn any IR function from remote controller
              mCIR.learnIRCmd(10); // set 10sec timeout
              textView.setText("Learning for 10 seconds");
          }       
      };
  
      @Override
      protected void onResume() {
          super.onResume();
          if(!mCIR.isStarted()) {
              mCIR.start(); //needed for HTC API (noop otherwise) before calling other APIs
          }
      }
      @Override
      protected void onPause() {
          super.onPause();
          if(mCIR.isStarted()) {
              mCIR.stop(); //needed for HTC API (noop otherwise)
          }
      }
  
      private OnClickListener btnSendIRListener = new OnClickListener() {
  
          public void onClick(View v) {
  
              if (!running) {
                  btnSend.setEnabled(false);
                  running = true;
                  new Thread(new Runnable() {
                      @Override
                      public void run() {
                          SharedPreferences preferences = getSharedPreferences(ConsumerIrManagerCompat.PREFERENCE_FILE_NAME, Context.MODE_PRIVATE);
                          // default IR data example from a laptop's ir remote: right button
                          int[] frame = {340,172,22,22,22,65,22,65,22,65,22,22,22,65,22,65,22,65,22,65,22,65,22,64,22,23,22,22,22,22,22,23,22,65,22,22,22,65,22,65,22,22,22,22,22,22,22,22,22,23,22,22,22,22,22,22,22,64,22,22,22,22,22,22,22,23,22,1600,341,86,22,3677,341,86,22,367};
                          int frequency = preferences.getInt(ConsumerIrManagerCompat.PREFERENCE_KEY_FREQUENCY, 38000);
                          // otherwise use last learned code
                          String framesaved = preferences.getString(ConsumerIrManagerCompat.PREFERENCE_KEY_FRAME, null);
                          if(framesaved!=null ) {
                              StringTokenizer tok = new StringTokenizer(framesaved.substring(1, framesaved.length()-2), ",");
                              int num = tok.countTokens();
                              if(num&gt;0) {
                                  frame = new int[num];
                                  int index = 0;
                                  while (tok.hasMoreTokens()) {
                                      frame[index++] = Integer.parseInt(tok.nextToken().trim());
                                  }
                              }
                          }
  
                          mCIR.transmit(frequency, frame);
  
                          try {
                              Thread.sleep(500);
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                          running = false;
                          runOnUiThread(new Runnable() { public void run() {btnSend.setEnabled(true);}});
                      }
                  }).start();
              }
          }
      };    
  /*
      private OnClickListener btnStartListener = new OnClickListener() {
          public void onClick(View v) {
              //HTC CIR commands are only allowed after using this start() method.
              mCIR.start();
              text1.setText("Attached to CIR control service");
              updateUI();
          }
  
      };
      private OnClickListener btnStopListener = new OnClickListener() {
          public void onClick(View v) {
              //TODO: before doing this, developer must make sure pending CIR commands.
              //will be handled if they had been sent to HTC CIR. 
              mCIR.stop();
              text1.setText("Detached from CIR control service");
              updateUI();
          }
      };
  */
      //TODO: HTC: Use this method to cancel sending IR command and learning IR command
      // Example: Before learning IR activity finishes, cancel command can stop it.
      // Example: If send an IR command with repeat count 255, cancel command can stop it. 
      //
      // mCIR.cancelCommand();
  </code></pre>