ConsumerIrManage.hasIrEmitter()始终返回false(API 19)

时间:2013-11-27 13:54:04

标签: android android-4.4-kitkat infrared

我在LG G2上拨打ConsumerIrManager.hasIrEmitter(),但它总是返回false

根据Infrared transmitters上的文件:

  

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

     

您应该首先通过拨打hasIrEmitter()来检查设备是否包含红外线发射器,但如果您的应用仅兼容有设备的设备,则应在清单中加入<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 个答案:

答案 0 :(得分:14)

对于其他任何想要从十六进制红外代码转到十进制数字的人来说,计算&#39;模式到小数&#39;持续时间&#39;图案:

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

使用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};

现在您将两个模式作为静态final 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需要哪种模式。

答案 1 :(得分:3)

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

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

但我有一个问题 transmit()的行为与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 Edition的移植错误,或者 Android 4.4的一个错误。


注意:在三星Tab2上尝试使用IR时我注意到的是时间周期也减少了25.6倍(实际脉冲长度/ 25.6)因此这可能是IR发射器模块的内部功能?

答案 2 :(得分:1)

我使用CM 11在HTC One上正常工作。模式数组包含脉冲数,而不是时序。这是Google文档中的错误。

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

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

答案 3 :(得分: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

它给了我一个信息:“没有发现IR发射器!”

函数hasIrEmitter()返回false。似乎没有实现ConsumerIrManager API。