【问题标题】:Request lockscreen access throws exception hangs or throws exception in mscorlib.dll请求锁屏访问在 mscorlib.dll 中引发异常挂起或引发异常
【发布时间】:2015-06-26 16:39:09
【问题描述】:

我使用以下方法在 WinRT 中请求锁屏访问:

public async void RequestLockScreenAccess()
    {
        var status = BackgroundExecutionManager.GetAccessStatus();
        if (status == BackgroundAccessStatus.Unspecified || status == BackgroundAccessStatus.Denied)
            status = await BackgroundExecutionManager.RequestAccessAsync();
        switch (status)
        {
            case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity:
                _mainInfo.NotifyUser = "This app is on the lock screen and has access to Always-On Real Time Connectivity.";
                break;
            case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity:
                _mainInfo.NotifyUser = "This app is on the lock screen and has access to Active Real Time Connectivity.";
                break;
            case BackgroundAccessStatus.Denied:
                _mainInfo.NotifyUser = "This app is not on the lock screen.";
                break;
            case BackgroundAccessStatus.Unspecified:
                _mainInfo.NotifyUser = "The user has not yet taken any action. This is the default setting and the app is not on the lock screen.";
                break;
        }
    }

这会给我 2 个不同的错误。如果我在行前或行上放置断点

status = await BackgroundExecutionManager.RequestAccessAsync();

代码将执行,但抛出以下异常:

在 mscorlib.dll 中出现“System.Exception”类型的未处理异常 附加信息:未找到元素。 (来自 HRESULT 的异常:0x8002802B (TYPE_E_ELEMENTNOTFOUND))

正如我在另一篇文章中看到的,这是其他人知道的错误,不了解 Microsoft。如果我不在此行之前放置断点,则执行将挂起。我在这里做错了什么?

似乎如果我卸载我的应用程序,它可能会工作,但在重新运行后它最终会再次失败。

【问题讨论】:

    标签: c# windows-8 windows-runtime


    【解决方案1】:

    在访问锁屏访问时,我知道有两个错误。第一个,如果您在该行上有断点,那么执行将失败,因为您的应用程序没有在前台运行(您在 Visual Studio 中,而不是在您的应用程序中)并且锁屏对话框找不到您的应用程序的主窗口。

    在模拟器中运行时会出现另一个问题——对GetAccessStatus的每次调用都会抛出一个异常,因为在模拟器中基本上不允许这种调用。

    如果您想对此进行调试,请在 GetAccessStatus 调用之后放置断点并在本地计算机上对其进行测试,它应该可以正常工作。

    更新,当在非 UI 线程上调用 RequestAccessAsync 方法时,我也遇到了这个异常。在 UI 线程上调用时,它工作正常。

    【讨论】:

    • 好的,谢谢,这是有道理的。但我没有在模拟器中运行。在我将执行移到按钮事件处理程序中之后,它起作用了。但我当然想自动请求锁屏访问。还有什么我应该知道的吗?
    • 当调用需要编组到另一个线程时,可能会引发类型库错误。确保您只在程序的主 UI 线程上运行此代码。
    【解决方案2】:

    您是否已验证您的包清单具有启用锁屏的应用所需的所有设置?

    我在调用 GetAccessStatus 时不断抛出异常。检查清单文件后,我注意到“锁定屏幕通知”设置为空白。将其设置为“徽章”或“徽章和平铺测试”并选择徽章徽标即可解决异常问题。

    【讨论】:

      【解决方案3】:

      我在捕捉模式下也有同样的问题(也在模拟器和断点中)。

      我的解决方法如下:

      1. 在应用启动后立即在主页上调用 RequestAccessAsync,例如在 OnGotFocus 方法中。
      2. 它应该只被调用一次,并且永远不要在快照模式下调用。
      3. 不要尝试在模拟器中执行。
      4. 不要在这个方法上设置断点。

        private bool _isAccessRequested;
        protected override void OnGotFocus(RoutedEventArgs e)
        {
            if (!_isAccessRequested)
            {
                _isAccessRequested = true;
                BackgroundExecutionManager.RequestAccessAsync();
            }
        }
        

      【讨论】:

        【解决方案4】:

        这应该可以帮助你:

        async void MainPage_Loaded(object sender, RoutedEventArgs args)
        {
            var allowed = await Windows.ApplicationModel.Background
                .BackgroundExecutionManager.RequestAccessAsync();
            System.Diagnostics.Debugger.Break();
        }
        

        祝你好运!

        【讨论】:

        • 因为你不能确定在任意的 1000 毫秒延迟之后,下面的方法调用不会抛出异常。这不是一个值得推荐的解决方案,即使它可以工作。
        猜你喜欢
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        • 2014-10-25
        • 2017-12-29
        • 2023-03-14
        • 2017-01-17
        • 2014-06-13
        • 2012-03-21
        相关资源
        最近更新 更多