android - HTC IR API Lollipop

标签 android android-5.0-lollipop infrared

在 lollipop 更新后,我试图让红外发射器在 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();

最佳答案

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 库。 我还没有让它完全工作,但我已经让它传输了。似乎我们又回到了使用脉冲计数而不是持续时间。

关于android - HTC IR API Lollipop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30390787/

相关文章:

android - 带有 USB OTG 的 Android 设备是否支持红外线收发器?

Android Studio 在构建项目时出现 R 错误

android - 构建播放器时出错 : IOException: Failed to Move File

android - 自定义 PagerTabStrip 如何通过单击禁用切换选项卡 - 不起作用

android - 如何在 Android Lollipop 设备的辅助 SD 卡中创建新文件?

c - 如何通过esp32 rmt Ringbuffer接收长数据帧

javascript - 将 google map API 标记限制为每个标记只能点击一次

android - 无法解决 : com. android.support :appcompat-v7:27. +(依赖错误)

android - Android L Preview 上 ActionBar 中的 ProgressBar

opencv - 如何在opencv中访问红外传感器图像