【问题标题】:capture permission granted complete event捕获权限授予完成事件
【发布时间】:2017-11-29 02:55:34
【问题描述】:

我正在使用 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的权限?

【问题讨论】:

  • 感谢您的快速回复。我去看看。
  • onRequestPermissionsResult 用于 as3 还是 android studio?
  • 显示你的代码,也许吧? “无法捕捉”听起来很奇怪。
  • 在测试它时,我遇到了一个完全不同的问题。虽然我对事件本身没有任何问题,但调用 requestPermission 并没有为我提供任何选项,而是立即使用当前权限触发 PermissionEvent。我使用 AIR 24 SDK 到 AIR 24 运行时 (Flash Player 35) 构建它并在 Android 6 上对其进行测试。

标签: android actionscript-3 flash permissions


【解决方案1】:

最后,我想通了。先决条件:

  • AIR 运行时 24+
  • Android 6+
  • APK 必须在 WRITE_EXTERNAL_STORAGE 权限下发布(否则它会自动DENIED - 这是我遇到的问题)

然后,这段代码对我来说很好用,它显示 Android 的“授予权限”对话框,然后根据我的选择输出 GRANTED 或 DENIED。 Log 类只是我自己的一个调试面板,您可以将 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());
        }
    }
}

【讨论】:

  • PERMISSION_STATUS 是立即执行还是仅在权限状态更改后才执行?
  • 事实证明我上面的代码可以正常工作。问题是我需要阅读两个文本文件。如果应用程序找不到第一个,那么它将尝试读取第二个。当第二个文本文件尝试读取时,我输入了相同的代码。但在第二次,它会在设备上引发错误。它在电脑上运行良好。为什么会抛出错误?我知道,我不能同时请求多个权限,但我不会同时请求权限。但是,我两次请求相同的许可,但不是同一时间。我不允许两次请求相同的权限吗?
  • @TheGunners 据我测试上面的代码,一旦用户自愿授予权限,任何后续的 requestPermission 都会触发 PermissionEventstatus 立即设置为 granted。这样做时我没有遇到任何异常。此外,一旦用户授予权限,即使您关闭并重新打开应用程序,它仍然被授予,除非您在应用程序设置中关闭给定权限(在这种情况下,行为恢复为初始并且需要调用 requestPermission 再次)。
  • 我不知道为什么,但它显示错误。但我已经放弃了代码。现在我只请求一次许可。还有一个问题,是否可以在请求权限时添加描述?
  • @TheGunners 描述?什么样的描述?您是指“授予权限”Android 对话框吗?
猜你喜欢
  • 2020-12-07
  • 1970-01-01
  • 2019-06-18
  • 2016-08-24
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多