我使用以下方法在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))
正如我在另一篇文章中所读到的,这是其他人所知的错误,不了解微软。如果我没有在此行之前放置断点,则执行将挂起。我在这做错了什么?
似乎如果我卸载我的应用程序,它可能会工作,但在重新运行后它最终会再次失败。
答案 0 :(得分:6)
访问锁屏访问时,我知道有两个错误。首先,如果你在该行上有断点,那么执行将失败,因为你的应用程序没有在前台运行(你在Visual Studio中,而不在你的应用程序中),并且锁屏对话框找不到你应用程序的主窗口。
在Simulator中运行时会出现另一个问题 - GetAccessStatus上的每次调用都会引发异常,因为在Simulator中基本上不允许此调用。
如果你想调试它,那么在GetAccessStatus调用之后放置你的断点并在本地机器上测试它,它应该可以工作。
更新,在非UI线程上调用RequestAccessAsync方法时,我也遇到此异常。在UI线程上调用时,它工作正常。
答案 1 :(得分:0)
您是否确认您的套餐清单包含启用锁屏的应用所需的所有设置?
调用GetAccessStatus时,我一直抛出异常。在检查清单文件时,我注意到“锁定屏幕通知”设置保留为空白。将其设置为“徽章”或“徽章和图块测试”并选择徽章徽标可解决此异常问题。
答案 2 :(得分:0)
我在捕捉模式下也有同样的问题(也在模拟器和断点处)。
我的解决方法如下:
不要在此方法上设置断点。
private bool _isAccessRequested;
protected override void OnGotFocus(RoutedEventArgs e)
{
if (!_isAccessRequested)
{
_isAccessRequested = true;
BackgroundExecutionManager.RequestAccessAsync();
}
}
答案 3 :(得分:0)
这可以帮到你:
async void MainPage_Loaded(object sender, RoutedEventArgs args)
{
var allowed = await Windows.ApplicationModel.Background
.BackgroundExecutionManager.RequestAccessAsync();
System.Diagnostics.Debugger.Break();
}
祝你好运!