【问题标题】:HTC ONE M8 IR Blaster after Lollipop Update not working棒棒糖更新后 HTC ONE M8 IR Blaster 无法正常工作
【发布时间】:2015-05-04 01:45:20
【问题描述】:

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

    ConsumerIrManager mCIR = (ConsumerIrManager)getSystemService(Context.CONSUMER_IR_SERVICE);
    mCIR.transmit(freq, pat);

freq 和 pattern 是打开电视所需的值(来自制造商)

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

【问题讨论】:

标签: android android-5.0-lollipop infrared


【解决方案1】:

是的,这个问题似乎是 Android 官方错误跟踪器上的 reported

我正在开发一个使用官方 Consumer IR API 的应用程序 在 Android 4.4 KitKat 中引入。自从 Lollipop 推出以来 我得到的流行设备,如 HTC One M8 或三星 Galaxy S5 许多来自上述设备的用户报告我的应用程序无法运行 棒糖。我自己没有棒棒糖设备,但我借了一个 M8 并做了一些测试。

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

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

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

这是一个HTC-only fix,有人发现他的 M7 由于棒棒糖更新而停止工作后。在他们切换到谷歌官方 api 之前,他基本上恢复到了 IR HTC API 的早期版本。

否则,您应该在错误跟踪器上为该问题加注星标,并可能让您自己的用户也这样做。对此问题加注星标的人越多,它的优先级就越高。

【讨论】:

  • 该死,我刚刚将我的 Galaxy S4 更新为 Lollipop,而我编写的 IR blaster 应用程序刚刚停止工作......我想这是一个错误。
【解决方案2】:

我刚刚为三星设备解决了这个问题:

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

对于 Android 4.4.3 及更高版本,模式的每个元素如果为开/关脉冲的微秒数。

例子:

以 38000Hz 发射波 0.5 秒开、0.5 关、0.5 开

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

对于 Android 4.4.3+,您的模式将是 [500000, 500000, 500000] - 也就是说您将每次转换为微秒(我们)。

我要把这件事归咎于谷歌:在 4.4.3 发布之前,他们的 API 说使用周期数,在 4.4.3 之后将其更改为使用微秒(us),三星只是遵循API 从而破坏了我们的应用程序。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      *编辑:可在此处找到此修复程序的更新版本:https://stackoverflow.com/a/28934938/1042362

      试一试:

      /*
       * 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 一台。更新后 IR blaster 甚至不亮 :( 任何更多帮助将不胜感激。
      • @alexward1230 你的问题解决了吗?我有一个 ir 应用程序,在 HTC 上,一个 m7 android 5.1 不能在 m8 上运行,在三星上一切正常。我不知道该怎么做更多...
      • @GMG 你试过上面的答案了吗?自从他尝试了该代码后,我已经对其进行了更新,因此应该会有所不同。
      【解决方案5】:

      我对 HTC One M7 的体验: 1) KitKat 4.4.3 ConsumerIRManager 代码运行良好,传递了一个微秒数组。

      2) 更新到 Lolipop 5.0.2,IR Led 根本没有传输,这是无操作问题。我重构了我的代码以使用 HTC API,它需要“时钟滴答”而不是直接微秒的波形。现在一切正常。

      似乎我们不能在 HTC One 上使用 ConsumerIRManager,除非是非常特定的版本,即 4.4.3。

      【讨论】:

      • 您能否提供有关如何使用 HTC 特定 API 以及如何获取所需库等的信息?
      • 哇,很抱歉我很久以前就错过了这个请求。这是我编写的一个模块,它使用 HTC IR 库运行良好。多年前,我通过加入 HTC 网站上的 HTCDev 开发者网络获得了库本身。如果您仍需要 HTCIR.jar 文件,请告诉我。
      • 超时了。这是我的完整回复:哇,很抱歉我很久以前就错过了这个请求。这是我编写的模块的链接,该模块使用 HTC IR 库运行良好。多年前,我通过加入 HTC 网站上的 HTCDev 开发者网络获得了库本身。 HTCIR.jar 文件也在共享目录中。有一次,我在使用 jar 文件时遇到了问题,出于某种原因重新创建了另一个。我认为这是某种重复的 Android 清单问题。 dropbox.com/sh/nhebktyjc6owmlt/AABjYvfJ4rYknRuYh0t_83D3a?dl=0
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 2015-08-12
      • 2015-12-24
      • 1970-01-01
      • 2016-05-02
      相关资源
      最近更新 更多