Intereting Posts
Лучшие практики для соглашений об именах ID в Android? GCM дает нулевое сообщение Google Cloud Messaging Push-уведомление Как добавить флажок в диалоговое окно предупреждения Как Android OS рассчитывает использование памяти в приложении? Уведомление GCM Push с Asp.Net Для Android требуется уровень соответствия компилятора 5.0 или 6.0. Вместо этого найдено «1.7». Используйте Android Tools> Fix Project Properties Какова ситуация с поддержкой Android для OMA DRM? Каков наилучший способ узнать новую версию для внешних библиотек, используемых в проекте Android Studio Как сделать отдельный класс для библиотеки волейбола и вызвать весь метод волейбола из другого вида деятельности и получить ответ? Android ListView с CursorAdapter имеет неправильную позицию прокрутки после вызова Requery при добавлении новых элементов Android – Скрыть поле даты в datepickerdialog Вызов скрытого API в Android для отключения экрана Android RSA Keypair Generation – Должен ли я использовать стандартный Java / Bouncy Castle / Spongy Castle / JSch / Other? Данные остаются в локальном хранилище данных после открепления

API ConsumerIrManager 19

Http://developer.android.com/about/versions/android-4.4.html#Wireless http://developer.android.com/reference/android/hardware/ConsumerIrManager.html

Инфракрасные передатчики

При работе на устройстве, которое включает инфракрасный (ИК) передатчик, теперь вы можете передавать ИК-сигналы с помощью API-интерфейсов ConsumerIrManager. Чтобы получить экземпляр ConsumerIrManager, вызовите getSystemService () с CONSUMER_IR_SERVICE в качестве аргумента. Затем вы можете запросить поддерживаемые ИК-диапазоны устройства с помощью getCarrierFrequencies () и передать сигналы, передав желаемую частоту и шаблон сигнала с помощью функции передачи ().

Вы всегда должны сначала проверить, включает ли устройство ИК-передатчик, вызвав hasIrEmitter (), но если ваше приложение совместимо только с устройствами, которые его имеют, вы должны включить элемент в манифест для «android.hardware.consumerir» (FEATURE_CONSUMER_IR ).

Кто-нибудь попробует?

HasIrEmitter () возвращает false для моего LG G2

В MainActivity.java

import android.hardware.ConsumerIrManager; .... @Override protected void onCreate(Bundle savedInstanceState) { .... ConsumerIrManager mCIR = (ConsumerIrManager)getSystemService(CONSUMER_IR_SERVICE); Log.e(TAG,"mCIR.hasIrEmitter(): " + mCIR.hasIrEmitter()); PackageManager pm = getPackageManager(); Log.e(TAG,"pm.hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR): " + pm.hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)); FeatureInfo[] fi = pm.getSystemAvailableFeatures(); for (int i=0;i<fi.length;i++){ Log.e(TAG,"Feature: " + fi[i].name); } .... } 

В AndroidManifest.xml

  <uses-permission android:name="android.permission.TRANSMIT_IR" android:required="false" /> <uses-feature android:name="android.hardware.consumerir" /> 

В списке SystemAvailableFeatures я не вижу «android.hardware.consumerir» (FEATURE_CONSUMER_IR), но G2 определенно имеет IR

Solutions Collecting From Web of "API ConsumerIrManager 19"

Для всех, кто хочет перейти от шестнадцатеричного ИК-кода к десятичному «счетному» шаблону к десятичному «длительному» шаблону:

Шестиугольный код Samsung Power (от remotecentral.com ):

 0000 006d 0022 0003 00a9 00a8 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 003f 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 003f 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0015 0040 0015 0015 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 003f 0015 0702 00a9 00a8 0015 0015 0015 0e6e 

Преобразование в десятичное с помощью метода hex2dec в irdude :

 38028,169,168,21,63,21,63,21,63,21,21,21,21,21,21,21,21,21,21,21,63,21,63,21,63,21,21,21,21,21,21,21,21,21,21,21,21,21,63,21,21,21,21,21,21,21,21,21,21,21,21,21,64,21,21,21,63,21,63,21,63,21,63,21,63,21,63,21,1794,169,168,21,21,21,3694 

Используйте первый аргумент как свою частоту и поместите остальные в массив int для вашего шаблона счета:

 private static final int SAMSUNG_FREQ = 38028; private static final int[] SAMSUNG_POWER_TOGGLE_COUNT = {169,168,21,63,21,63,21,63,21,21,21,21,21,21,21,21,21,21,21,63,21,63,21,63,21,21,21,21,21,21,21,21,21,21,21,21,21,63,21,21,21,21,21,21,21,21,21,21,21,21,21,64,21,21,21,63,21,63,21,63,21,63,21,63,21,63,21,1794,169,168,21,21,21,3694}; 

Используйте частоту для поиска импульсов в секунду:

 Frequency: 38028; Second: 1,000,000 Microseconds Second/Frequency = Pulses 1000000/38028 = ~26.3 Pulses 

Преобразование шаблона Count Pattern в Duration, умножая каждое значение на импульсы:

 169 * 26.3 = 4444 168 * 26.3 = 4418 21 * 26.3 = 552 ... 

Если вам нужен быстрый способ получить строку со всеми значениями Duration, просто запустите шестнадцатеричный код с помощью метода hex2dec и затем используйте этот вывод в этом методе:

 protected String count2duration(String countPattern) { List<String> list = new ArrayList<String>(Arrays.asList(countPattern.split(","))); int frequency = Integer.parseInt(list.get(0)); int pulses = 1000000/frequency; int count; int duration; list.remove(0); for (int i = 0; i < list.size(); i++) { count = Integer.parseInt(list.get(i)); duration = count * pulses; list.set(i, Integer.toString(duration)); } String durationPattern = ""; for (String s : list) { durationPattern += s + ","; } Log.d(TAG, "Frequency: " + frequency); Log.d(TAG, "Duration Pattern: " + durationPattern); return durationPattern; } 

Это будет печатать строку десятичных значений продолжительности в журнале. Затем я просто скопировал (не включая первое значение) и создав статический окончательный массив int следующим образом:

  private static final int[] SAMSUNG_POWER_TOGGLE_DURATION = {4495,4368,546,1638,546,1638,546,1638,546,546,546,546,546,546,546,546,546,546,546,1638,546,1638,546,1638,546,546,546,546,546,546,546,546,546,546,546,546,546,1638,546,546,546,546,546,546,546,546,546,546,546,546,546,1664,546,546,546,1638,546,1638,546,1638,546,1638,546,1638,546,1638,546,46644,4394,4368,546,546,546,96044}; 

Итак, теперь, когда у вас есть два шаблона как статические окончательные массивы int, вы можете передавать:

 ConsumerIrManager mCIR; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get a reference to the ConsumerIrManager mCIR = (ConsumerIrManager) this.getSystemService(Context.CONSUMER_IR_SERVICE); setContentView(R.layout.consumer_ir); // Set the OnClickListener for the button so we see when it's pressed. findViewById(R.id.send_button).setOnClickListener(mSendClickListener); } View.OnClickListener mSendClickListener = new View.OnClickListener() { public void onClick(View v) { if (!mCIR.hasIrEmitter()) { Log.e(TAG, "No IR Emitter found\n"); return; } if (Build.VERSION.SDK_INT == 19) { int lastIdx = Build.VERSION.RELEASE.lastIndexOf("."); int VERSION_MR = Integer.valueOf(Build.VERSION.RELEASE.substring(lastIdx+1)); if (VERSION_MR < 3) { // Before version of Android 4.4.2 mCIR.transmit(SAMSUNG_FREQ, SAMSUNG_POWER_TOGGLE_COUNT); } else { // Later version of Android 4.4.3 mCIR.transmit(SAMSUNG_FREQ, SAMSUNG_POWER_TOGGLE_DURATION); } } } }; 

Примечание. Я не уверен, какой шаблон 4.4.4 нужен.

Я попробовал ConsumerIrManager с помощью HTC One Google Play Edition.

ConsumerIrManager.hasIrEmitter () возвратил true. И я мог передавать ИК-коды с помощью consumerIrManager.transmit ().

Но у меня была проблема, что поведение метода передачи () отличалось от документа API Android.

Документ API выглядит следующим образом.

 public void transmit (int carrierFrequency, int[] pattern) Tansmit and infrared pattern This method is synchronous; when it returns the pattern has been transmitted. Only patterns shorter than 2 seconds will be transmitted. Parameters carrierFrequency The IR carrier frequency in Hertz. pattern The alternating on/off pattern in microseconds to transmit. 

Но казалось, что единица параметра «шаблон» составляла 25мисекунд, а не микросекунды. Это связано с тем, что длина одного импульса носителя составляла 25 миллисекунд. (Я устанавливал несущую частоту 40000 Гц, поэтому длина одного импульса составляла 25 мкс.)

Я не уверен, что это ошибка переноса HTC One в Google Play Edition или ошибка Android 4.4.


Примечание. То, что я заметил при попытке использовать ИК-порт на вкладке Samsung Tab2, было также отключено в 25,6 раза (фактическая длительность импульса / 25,6), поэтому это может быть внутренней функцией модуля ИК-передатчика?

У меня есть эта работа на HTC One, использующая CM 11. Массив шаблонов содержит количество импульсов, а не таймингов. Это ошибка в документации Google.

Я подозреваю, что это не сработает на LG и Sony, поскольку они используют ИК-чип со встроенными базами данных кодов. Надеюсь, я ошибаюсь.

У приложений Touchsquid скоро появится этот драйвер.

Я сделал небольшое приложение для тестирования IR Balster на моем LG G2, используя

https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/hardware/ConsumerIr.java

https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/res/layout/consumer_ir.xml

Он дал мне сообщение: «ИК-излучатель не найден!»

Функция hasIrEmitter () возвращает false. API-интерфейс ConsumerIrManager, похоже, не реализован.