HTC IR API Lollipop

时间:2015-05-22 07:28:30

标签: android android-5.0-lollipop infrared

我想在棒棒糖更新后让红外发射器在HTC ONE m8上工作。我正在尝试使用这里找到的HTC Sense IR SDK(addon-htc_ir_api-htc-19):http://www.htcdev.com/devcenter/opensense-sdk/htc-ir-api我导入示例项目(HTCConsumerIR)并在我的HTC设备上运行应用程序而应用程序根本不传输一个信号。我没有错误,但红外发射器甚至没有打开。这是同一个项目,根本没有任何修改。为什么不起作用?任何有红外线工作HTC的人的帮助都会被挪用。它可以在除HTC之外的每个设备上进行红外工作。

以下是主类的代码,如果它有帮助的话:

      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>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();

1 个答案:

答案 0 :(得分:1)

HtcConsumerIr应用程序不适用于Lollipop,因为如果你有KitKat它只使用HTC库。 如果您打开ConsumerIrManagerCompat.java并更改此行:

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT
                              && hasPackage("com.htc.cirmodule", context)) {
        return new ConsumerIrManagerHtc(context);
    } else {
        return new ConsumerIrManagerBase(context);
    }

到此:

if (hasPackage("com.htc.cirmodule", context)) {
        return new ConsumerIrManagerHtc(context);
    } else {
        return new ConsumerIrManagerBase(context);
    }

它会起作用。

我目前正在尝试升级到Lollipop后让我的应用再次运行。它在KitKat中运行良好,无需使用HTC库。 我还没有完全正常工作,但我已经让它传输了。似乎我们又回到使用脉冲计数而不是持续时间。