Android 棒棒糖更新后HTC ONE M8红外爆炸机不工作

Android 棒棒糖更新后HTC ONE M8红外爆炸机不工作,android,android-5.0-lollipop,infrared,Android,Android 5.0 Lollipop,Infrared,我需要在HTC One设备上使用红外发射器。在lolipop更新之前,我可以做到这一点,但现在我的代码不起作用 ConsumerIrManager mCIR = (ConsumerIrManager)getSystemService(Context.CONSUMER_IR_SERVICE); mCIR.transmit(freq, pat); 其中,freq和pattern是打开电视所需的值(来自制造商) 我没有得到任何错误运行此代码,唯一的问题是,红外发射器不亮的HTC一个设

我需要在HTC One设备上使用红外发射器。在lolipop更新之前,我可以做到这一点,但现在我的代码不起作用

    ConsumerIrManager mCIR = (ConsumerIrManager)getSystemService(Context.CONSUMER_IR_SERVICE);
    mCIR.transmit(freq, pat);
其中,freq和pattern是打开电视所需的值(来自制造商)


我没有得到任何错误运行此代码,唯一的问题是,红外发射器不亮的HTC一个设备。(通过摄像机观看红外爆炸机)。我不明白,完全相同的代码适用于galaxy s5设备。如果有人能让红外线在HTC one设备上工作,我将不胜感激。

是的,这个问题似乎已经出现在Android的官方bug追踪器上

我正在开发一个应用程序,它使用官方的消费者红外API 在Android 4.4 KitKat中引入。自从棒棒糖推出以来 像HTC One M8或三星Galaxy S5这样的流行设备我正在购买 许多来自上述设备用户的报告称我的应用程序无法运行 棒棒糖。我自己没有棒棒糖装置,但我借了一个M8 做了一些测试

似乎ConsumerIrManager.transmit()方法是不可操作的 棒棒糖。无论给定的模式是什么,它都会立即返回

在发现Galaxy S5用户也有同样的问题之前,我 就此事联系HTC支持部门,并被告知联系 谷歌支持

似乎S5设备也遇到了同样的问题,尽管很难说,因为开发者从S5所有者那里得到了相互矛盾的报告

这是一个有人在M7因为棒棒糖更新而停止工作后发现的。他基本上恢复了在他们切换到官方谷歌api之前的早期版本


否则,您应该在bug跟踪器上启动该问题,并可能指示您自己的用户也这样做。越多的人关注这一问题,它的优先级就越高

对于三星设备,我刚刚解决了这个问题:

在Android 4.4.3之前,模式的每个元素都是开/关脉冲的周期数

对于Android 4.4.3及以上版本,如果模式的每个元素的开启/关闭脉冲数为微秒

例如:

以38000Hz的频率传输0.5s开、0.5关、0.5开的波

在Android 4.4.3之前,您的模式应该是[19000,190000,19000]——19000来自0.5s*38000Hz

对于Android 4.4.3+来说,您的模式将是[500000,500000,500000]——也就是说,您每次转换为微秒(us)


我要把这一点归咎于谷歌:在4.4.3发布之前,他们的API据说使用了循环数,而在4.4.3版本更改为使用微秒(us)之后,三星只是简单地遵循API,从而破坏了我们的应用程序。

*编辑:此修复程序的更新版本可以在这里找到:

试一试:

/*
 * preforms some calculations on the codesets we have in order to make them work with certain models of phone.
 *
 * HTC devices need formula 1
 * Samsungs want formula 2
 *
 * Samsung Pre-4.4.3 want nothing, so just return the input data
 *
 */
private static int[] string2dec(int[] irData, int frequency) {
    int formula = shouldEquationRun();

    //Should we run any computations on the irData?
    if (formula != 0) {
        for (int i = 0; i < irData.length; i++) {
            if (formula == 1) {
                irData[i] = irData[i] * 1000000 / frequency; 
            } else if (formula == 2) {
                irData[i] = (int) Math.ceil(irData[i] * 26.27272727272727); //this is the samsung formula as per http://developer.samsung.com/android/technical-docs/Workaround-to-solve-issues-with-the-ConsumerIrManager-in-Android-version-lower-than-4-4-3-KitKat
            }
        }
    }
    return irData;
}

/*
 * This method figures out if we should be running the equation in string2dec,
 * which is based on the type of device. Some need it to run in order to function, some need it NOT to run
 *
 * HTC needs it on (HTC One M8)
 * Samsung needs occasionally a special formula, depending on the version
 * Android 5.0+ need it on. 
 * Other devices DO NOT need anything special.
 */
private static int shouldEquationRun() {
    //Some notes on what Build.X will return
    //System.out.println(Build.MODEL); //One M8
    //System.out.println(Build.MANUFACTURER); //htc
    //System.out.println(Build.VERSION.SDK_INT); //19

    //Samsung's way of finding out if their OS is too new to work without a formula:
    //int lastIdx = Build.VERSION.RELEASE.lastIndexOf(".");
    //System.out.println(Build.VERSION.RELEASE.substring(lastIdx+1)); //4

    //handle HTC
    if (Build.MANUFACTURER.equalsIgnoreCase("HTC")) {
        return 1;
    }
    //handle Lollipop (Android 5.0.1 == SDK 21) / beyond
    if (Build.VERSION.SDK_INT >= 21) {
        return 1;
    }
    //handle Samsung PRE-Android 5
    if (Build.MANUFACTURER.equalsIgnoreCase("SAMSUNG")) {
        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
                //Note: NO formula here, not even the other one
                return 0;
            } else {
                // Later version of Android 4.4.3
                //run the special samsung formula here
                return 2;
            }
        }
    }
    //if something else...
    return 0;
}
/*
*对我们拥有的代码集进行一些计算,以使它们与某些型号的手机配合使用。
*
*HTC设备需要一级方程式
*三星想要二级方程式
*
*三星Pre-4.4.3不需要任何东西,只需返回输入数据即可
*
*/
私有静态int[]string2dec(int[]irData,int-frequency){
int公式=shouldEquationRun();
//我们应该在irData上运行任何计算吗?
如果(公式!=0){
for(int i=0;i=21){
返回1;
}
//处理三星安卓5之前的问题
if(Build.MANUFACTURER.equalsIgnoreCase(“三星”)){
如果(Build.VERSION.SDK_INT>=19){
int lastIdx=Build.VERSION.RELEASE.lastIndexOf(“.”);
int VERSION_MR=Integer.valueOf(Build.VERSION.RELEASE.substring(lastIdx+1));
如果(版本\u MR<3){
//Android 4.4.2之前的版本
//注意:这里没有公式,即使是另一个也没有
返回0;
}否则{
//Android 4.4.3的更高版本
//在这里运行特殊的三星公式
返回2;
}
}
}
//如果有别的事。。。
返回0;
}

自4月底以来,股票遥控器已停止运行。下载Peel应用程序,它是M9上使用的品牌版本

我对HTC One M7的体验: 1) KitKat 4.4.3 ConsumerManager代码运行良好,通过了一个微秒数组

2) 更新至Lolipop 5.0.2,红外Led完全没有传输,无操作问题。我重构了我的代码以使用HTCAPI,它需要“时钟”中的波形