Привет. Я хочу отправить инфракрасный сигнал пульта ДУ на CD-плеер. Проблема в том, что функция удержания кнопки не работает в коде на Андроид. Эта кнопка имеет двойную функцию. При однократном нажатии она переключает трек CD-плеера LG, а при удержании кнопки она перематывает трек. Я делаю это для протокола NEC. Вот мой код. Буду очень благодарен за помощь!
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.repeatButton, 0x0808728D, false);
setupButton(R.id.volUpButton, 0x08086897, true);
setupButton(R.id.volDownButton, 0x0808E817, true);
}
private void setupButton(int buttonId, final int necCode, boolean isHoldable) {
Button button = findViewById(buttonId);
if (button != null) {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendIrSignal(necCode);
}
});
if (isHoldable) {
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, android.view.MotionEvent event) {
switch (event.getAction()) {
case android.view.MotionEvent.ACTION_DOWN:
isHolding = true;
sendIrSignal(necCode); // Первая передача при нажатии
startHoldingSignal(necCode); // Запуск повторных сигналов при удержании
return true;
case android.view.MotionEvent.ACTION_UP:
isHolding = false;
handler.removeCallbacksAndMessages(null); // Остановка повторных сигналов
return true;
}
return false;
}
});
}
}
}
private void startHoldingSignal(final int necCode) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (isHolding) {
sendHoldingSignal(); // Отправка повторного сигнала
handler.postDelayed(this, 110); // Повтор через 110 мс
}
}
}, 110); // Начало через 110 мс после первого сигнала
}
private void sendIrSignal(int necCode) {
irManager.transmit(38000, encodeNEC(necCode)); // Первая передача сигнала
}
private void sendHoldingSignal() {
// Передача повторного сигнала (9мс, 2.25мс, 0.5625мс)
int[] signal = new int[] {9000, 2250, 562}; // Импульс 9 мс, пауза 2.25 мс, импульс 0.5625 мс
irManager.transmit(38000, signal); // Отправка повторного сигнала
}
private int[] encodeNEC(int necCode) {
int[] encodedSignal = new int[68];
int i = 0;
// Начало сигнала (9 мс, 4.5 мс пауза)
encodedSignal[i++] = 9000; // 9 мс
encodedSignal[i++] = 4500; // 4.5 мс пауза
// Адрес и инверсия (27 мс для каждого бита)
for (int bit = 31; bit >= 0; bit--) {
if ((necCode & (1 << bit)) != 0) {
encodedSignal[i++] = 560; // 27 мс для бита 1
encodedSignal[i++] = 1690; // 27 мс для бита 1
} else {
encodedSignal[i++] = 560; // 27 мс для бита 0
encodedSignal[i++] = 560; // 27 мс для бита 0
}
}
// Конец сигнала (широкая пауза)
encodedSignal[i++] = 560;
encodedSignal[i++] = 39416; // Пауза на завершение
return encodedSignal;
}
}