About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jul

    22

    又一个 Bug,使用类的静态成员引用麦克风对象时无法侦听事件(已经在 AIR SDK 17 与 18 上测试过):

    static private const microphone:Microphone = Microphone.getMicrophone();

    那么在后续后代码中添加侦听器会无法侦听到事件:

    static public function someFunction(): void 
    {
        microphone.setSilenceLevel(04000)//4秒后停止
        microphone.gain = 100;
        microphone.rate = 44;

        //activateHandler与onSampleData事件侦听器都将不会执行
        microphone.addEventListener(ActivityEvent.ACTIVITY, activateHandler);
        microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
    }

    如果去掉这两个 static 修饰词,将上面的麦风引用改为实例对象是可以侦听到事件的。奇葩!

    Jul

    21

    发现 AS3 调用与系统相关的 API 功能时经常会发现 Bug,虽然这些 API 在桌面设备上看起来运行状态良好,但在移动开发时总会与实际情况不符。

    Microphone 类中有一个 muted 属性,可以用来判断用户是否禁用了麦克风访问权限。在网页中与纯 FlashPlayer 里它运行状况良好,但在 iOS 系统里测试时“XXXX 想访问您的麦克风”,无论我选择“不允许”或“好”,它它总是返回 false。然后又是一边 SDK 版本的替换(啊,又是一个“又”),从 SDK 16,换到17、18 测试结果都一样(因为 19 还是 Beta 版,我也懒的去测了)。

    Google 之,发现早在 4.0 版本时就已经有人在 Adobe 官方论坛提交过这个问题,官方没有作任何回复(除了有一个网友回复了一个无关紧要的相册访问的贴子,因为相册是一个应用,它会从一个应用给出提示,而 Microphone 是一个硬件,所以出错后是不会给你提示的;特别是:它的属性在返回时就已经出错了——“把错的当成对的,怎么可能再给出一个错的提示?”)。

    曲线救国的办法:在 setSilenceLevel() 方法中将 silenceLevel 值设为 0,让麦克风对象的 ActivityEvent.ACTIVITY 事件立即执行。建立一个实例变量并设为 false,在 activity 事件侦听器函数中把这个变量设为 true,加一个类似 setTimeout() 函数在200 或 500 毫秒后检测这个变量是否为 true,就可以判断出 activity 事件是否执行过。如果执行过表示有麦克风的访问权限,如果没有执行过,就表过没有权限,给出一个用户提示“设置——隐私——麦克风——XX应用”打开权限。