捕获权限授予完成事件

capture permission granted complete event

我正在使用 flash cc 创建一个应用程序。我需要存储许可。原来我需要询问用户使用存储设备的权限。我可以向用户征求许可并且它工作正常。我使用这个网站的例子:https://helpx.adobe.com/flash-player/release-note/fp_24_air_24_release_notes.html
但我的问题是我无法捕获访问存储权限的完整事件。因此,在我访问存储后我无法 运行 代码。是否可以捕获完整事件以授予任何权限?

我使用的代码:

var file:File = File.documentsDirectory.resolvePath("somefile.txt");
trace("url_txt:" + file.url);
file.addEventListener(PermissionEvent.PERMISSION_STATUS, function permissionStatusHandler(e:PermissionEvent):void
{                        
    file.removeEventListener(PermissionEvent.PERMISSION_STATUS, permissionStatusHandler);
    if(e.status == PermissionStatus.GRANTED)
    {                            
        myTextLoader.load(new URLRequest(file.url));
        myTextLoader.addEventListener(Event.COMPLETE, onLoadTextComp);
        myTextLoader.addEventListener(IOErrorEvent.IO_ERROR, loadingTextError);
    }
    else
    {
        showPermissionError();
    }
}
);
try
{
    trace("Requesting permission");
    file.requestPermission();
}
catch(error:Error)
{
    trace("Request permission error");
}

更新:

上面的代码似乎工作正常。但是当我试图在不同的时间两次请求相同的权限时,问题就出现了。我还有一个问题。我们可以在请求许可时添加描述吗?许多应用程序似乎都在添加说明为什么该应用程序需要该特定权限。是否有可能从 Flash as3 实现这一点?我查看了网络但找不到任何东西。以及如何请求 READ_PHONE_STATE 的权限?

我终于明白了。先决条件:

  • AIR 运行时 24+
  • Android6+
  • APK 必须在获得 WRITE_EXTERNAL_STORAGE 许可的情况下发布(否则它会自动 DENIED - 这就是我遇到的问题)

然后,这段代码对我来说工作得很好,它显示 Android 的 "Grant Permission" 对话框,然后根据我的选择输出 GRANTED 或 DENIED。 Log class 只是我自己的调试面板,你可以将 Log.log 调用更改为 trace 或在此处获取它(它没有依赖项):https://bitbucket.org/thydmitry/ru.delimiter/src/9083fb46ce1c/classes/ru/delimiter/utils/

package
{
    import ru.delimiter.utils.Log;

    import flash.filesystem.File;

    import flash.display.StageScaleMode;
    import flash.display.StageAlign;
    import flash.display.Sprite;

    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.PermissionEvent;

    import flash.permissions.PermissionStatus;

    public class Permissions extends Sprite
    {
        private var F:File;

        public function Permissions() 
        {
            if (stage) onStage();
            else addEventListener(Event.ADDED_TO_STAGE, onStage);
        }

        private function onStage(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, onStage);

            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            Log.create(this, true);

            Log.log("[Permissions Test] started");
            Log.log("File.permissionStatus:", File.permissionStatus);

            F = File.applicationStorageDirectory.resolvePath("somefile.txt");
            F.addEventListener(PermissionEvent.PERMISSION_STATUS, onPerm);

            stage.addEventListener(MouseEvent.CLICK, onClick);
        }

        private function onClick(e:MouseEvent):void
        {
            F.requestPermission();
        }

        private function onPerm(e:PermissionEvent):void
        {
            Log.log("User's decision:", e.status.toUpperCase());
        }
    }
}