Flash安全设置面板 - 收听关闭事件?

时间:2011-08-04 16:26:42

标签: flash actionscript-3 security events

将Flash与麦克风或相机配合使用时,系统会提示用户允许访问这些设备。这是通过内置的安全设置面板完成的。

当用户点击安全设置面板的关闭按钮时,是否有办法让事件处理程序得到通知?这似乎不可能......

对于麦克风,当用户更改安全面板中的设置时,可能会收到状态事件,但在用户仍然打开面板时会触发此事件。

4 个答案:

答案 0 :(得分:13)

在尝试搜索解决方案时,我偶然发现了这一点。

Flash Player bug report WITH WORKAROUND

我还没有测试过变通方法,但 仍然有效吗?祝你好运。

修改

对于那些不能/不会访问Adobe bug跟踪器的人来说,这是Philippe Piernot最初发布的解决方法:

var closed:Boolean = true;
var dummy:BitmapData;
dummy = new BitmapData(1, 1);

try
{
    // Try to capture the stage: triggers a Security error when the settings dialog box is open
    dummy.draw(stage);
}
catch (error:Error)
{
    closed = false;
}

dummy.dispose();
dummy = null; 

答案 1 :(得分:12)

调用安全面板(如ns.addStream(mic))

            // WHEN PRIVACY PANEL IS ON MOUSE EVENTS ARE DISABLED
            stage.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
            function onMouseOver(e:Event):void { 
                trace("privacy panel closed");
                //REMOVE THE LISTENER ON FIRST TIME
                stage.removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
                //doStuff
            }

答案 2 :(得分:6)

我已经通过下一个方式解决了这个问题:

private function showPrivacyDialog():void {
    var spr:Sprite = new Sprite();
    stage.focus = spr;
    spr.addEventListener( FocusEvent.FOCUS_OUT, handleFocusEvent );
    spr.addEventListener( FocusEvent.FOCUS_IN, handleFocusEvent );
    Security.showSettings( SecurityPanel.PRIVACY );
}

private function handleFocusEvent( event:Event ):void {
    event.target.removeEventListener( event.type, handleFocusEvent );
    const closed:Boolean = (event.type == FocusEvent.FOCUS_IN);
    trace( "Security Panel just", closed ? "closed!" : "shown!" );
    if (closed) {
        stage.focus = null; // or it can be restored to the previous value
    }
}

检查显示设置对话框的完整工具类SecurityPanelUtil,然后将其处理完毕并立即通过回调通知。

答案 3 :(得分:0)

使用Flash自己的显示引擎秘密渲染面板。为此,他们秘密地将面板添加到舞台的显示列表中。

您可以通过检查stage.getChildAt(stage.numChildren-1)是否等于null来检测此情况。这是一个不可能的场景,揭示了小组的存在。