6

我打电话ConsumerIrManager.hasIrEmitter()给我的 LG G2,但它总是返回false

根据有关红外发射器的文档:

在包含红外 (IR) 发射器的设备上运行时,您现在可以使用ConsumerIrManagerAPI 传输红外信号。要获取 的实例ConsumerIrManager,请调用getSystemService()withCONSUMER_IR_SERVICE作为参数。然后,您可以使用 查询设备支持的 IR 频率,getCarrierFrequencies()并通过传递所需的频率和信号模式来传输信号transmit()

您应该始终首先通过调用 来检查设备是否包含 IR 发射器hasIrEmitter(),但如果您的应用仅与具有 IR 发射器的设备兼容,则应<uses-feature>在清单中包含"android.hardware.consumerir"( FEATURE_CONSUMER_IR) 的元素。

我的代码如下:

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),但 LG G2 肯定有 IR。

有人成功使用过hasEmitterIr()吗?

4

4 回答 4

15

对于想要从十六进制 IR 代码到十进制“计数”模式再到十进制“持续时间”模式的任何其他人:

三星电源十六进制代码(来自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

使用 irdude 中的hex2dec方法转换为十进制:

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

通过将每个值乘以脉冲将计数模式转换为持续时间模式:

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 需要哪种模式。

于 2014-08-27T03:23:21.583 回答
3

我使用 HTC One Google Play Edition 尝试了 ConsumerIrManager。

consumerIrManager.hasIrEmitter() 返回 true。我可以通过 consumerIrManager.transmit() 传输 IR 代码。

但是我遇到了一个问题,即传输()的行为与 Android API 文档不同。

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.

但是参数“pattern”的单位似乎是25微秒,而不是微秒。这是因为载波的一个脉冲长度为25微秒。(我将carrierFrequency设置为40000Hz,所以一个脉冲的长度是25微秒。)

我不确定这是 HTC One Google Play 版的移植错误,还是 Android 4.4 的错误。


注意:我在三星 Tab2 上尝试使用 IR 时注意到的一点是时间周期也偏离了 25.6 倍(实际脉冲长度 / 25.6),所以这可能是 IR 发射器模块的内部功能吗?

于 2013-12-17T02:47:31.677 回答
1

我使用 CM 11 在 HTC One 上运行良好。模式数组包含脉冲数,而不是时间。这是 Google 文档中的错误。

我怀疑它不适用于 LG 和索尼,因为它们使用带有内置代码数据库的 IR 芯片。我希望我错了。

Touchsquid 应用程序很快就会有这个驱动程序。

于 2014-01-14T03:26:38.257 回答
0

我做了一个小应用程序来测试我的 LG G2 上的 IR Balster 使用

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。ConsumerIrManager API 似乎没有实现。

于 2014-05-14T13:19:04.233 回答