Какой код инфракрасного сигнала для протокола NEC при удержании кнопки?

Привет! Я пытаюсь отправить инфракрасный сигнал с пульта ДУ на CD-плеер, но сталкиваюсь с проблемой: функция длительного удержания кнопки в моем коде на Android не работает. Эта кнопка выполняет две задачи: при однократном нажатии она переключает трек на CD-плеере LG, а при удержании – перематывает трек. Я работаю с протоколом NEC. Пожалуйста, посмотрите мой код. Я буду признателен за любую помощь! 
<br/><br/>
<pre><code class="java">import android.os.Bundle;
import android.app.Activity;
import android.hardware.ConsumerIrManager;
import android.widget.Button;
import android.view.View;
import android.os.Handler;

public class MainActivity extends Activity {
    private ConsumerIrManager irManager;
    private Handler handler = new Handler();
    private boolean isHolding = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        irManager = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);

        // Устанавливаем обработчики для всех кнопок
        setupButton(R.id.powerButton, 0x08087887, false);
        setupButton(R.id.sleepButton, 0x080843BC, false);
        setupButton(R.id.eqButton, 0x080802FD, false);
        setupButton(R.id.upButton, 0x080848B7, false);
        setupButton(R.id.downButton, 0x0808C837, false);
        setupButton(R.id.bandButton, 0x08089A65, false);
        setupButton(R.id.playPauseButton, 0x080820DF, false);
        setupButton(R.id.stopButton, 0x0808A05F, false);
        setupButton(R.id.progButton, 0x0808B24D, false);
        setupButton(R.id.prevButton, 0x0808609F, false);
        setupButton(R.id.nextButton, 0x0808E01F, true);
        setupButton(R.id.repeatBu
  • 28 марта 2025 г. 21:45
Ответы на вопрос 1
В вашем коде на Java для передачи инфракрасного сигнала с использованием протокола NEC отсутствует реализация длительного удержания кнопки. Чтобы осуществить такую функциональность, вы можете использовать обработчики событий для отслеживания нажатия и отпускания кнопки. Вот пример, как это можно сделать:

```java
import android.os.Bundle;
import android.app.Activity;
import android.hardware.ConsumerIrManager;
import android.widget.Button;
import android.view.View;
import android.os.Handler;

public class MainActivity extends Activity {
    private ConsumerIrManager irManager;
    private Handler handler = new Handler();
    private boolean isHolding = false;
    private Runnable longPressRunnable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        irManager = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);

        // Устанавливаем обработчики для всех кнопок
        setupButton(R.id.powerButton, 0x08087887, false);
        setupButton(R.id.sleepButton, 0x080843BC, false);
        setupButton(R.id.eqButton, 0x080802FD, false);
        setupButton(R.id.upButton, 0x080848B7, false);
        setupButton(R.id.downButton, 0x0808C837, false);
        setupButton(R.id.bandButton, 0x08089A65, false);
        setupButton(R.id.playPauseButton, 0x080820DF, false);
        setupButton(R.id.stopButton, 0x0808A05F, false);
        setupButton(R.id.progButton, 0x0808B24D, false);
        setupButton(R.id.prevButton, 0x0808609F, false);
        setupLongPressButton(R.id.nextButton, 0x0808E01F);
        setupLongPressButton(R.id.repeatButton, 0x0808B03F);
    }

    private void setupButton(int buttonId, int signal, boolean isLongPress) {
        Button button = findViewById(buttonId);
        button.setOnClickListener(v -> sendIrSignal(signal));
    }

    private void setupLongPressButton(int buttonId, int signal) {
        Button button = findViewById(buttonId);

        button.setOnTouchListener((v, event) -> {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    sendIrSignal(signal);
                    isHolding = true;
                    longPressRunnable = new Runnable() {
                        @Override
                        public void run() {
                            if (isHolding) {
                                // Отправляем сигнал при удержании кнопки
                                sendIrSignal(signal);
                                handler.postDelayed(this, 100); // Повторяем через 100 мс
                            }
                        }
                    };
                    handler.post(longPressRunnable);
                    return true; // Сигнал об обработке события

                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    isHolding = false;
                    handler.removeCallbacks(longPressRunnable);
                    return true; // Сигнал об обработке события
            }
            return false; // Не обработано
        });
    }

    private void sendIrSignal(int signal) {
        // Метод для отправки IR сигнала
        // Не забудьте указать параметры протокола, такие как частота и длина сигнала
        int frequency = 38000; // Частота (пример)
        irManager.transmit(frequency, encodeNEC(signal));
    }

    private int[] encodeNEC(int signal) {
        // Кодирование для протокола NEC (замените на ваше кодирование)
        // Пример возвращает группу целых чисел для передачи
        // Не забудьте добавить нужную структуру предварительного и дополнительного кодирования
        return new int[]{};
    }
}
```

В этом коде использованы методы `OnTouchListener`, чтобы отслеживать нажатие и отпускание кнопок. Когда кнопка удерживается, выполняется периодическая отправка сигнала с использованием `Handler`. Это поможет реализовать функцию перемотки трека на вашем CD-плеере при удержании кнопки. Не забудьте настроить метод `encodeNEC` в зависимости от вашего протокола и спецификаций IR.
Похожие вопросы