2012-09-29 22 views
4

我用下面的方法來請求在鎖屏的WinRT訪問拋出異常:請求鎖屏訪問拋出異常掛起或在mscorlib.dll

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(); 

代碼將執行,但拋出以下異常:

類型的未處理的異常「System.Exception的」發生在mscorlib.dll 附加信息:找不到元素。 (異常來自HRESULT:0x8002802B(TYPE_E_ELEMENTNOTFOUND))

正如我在另一篇文章閱讀,這是爲他人所知的錯誤,不知道微軟。如果我不在這一行之前放置一個斷點,執行將會掛起。我在這裏做錯了什麼?

看來,如果我卸載我的應用程序,它可能會起作用,但之後一些重新運行它最終會再次失敗。

回答

6

訪問鎖屏訪問時,我知道有兩個錯誤。首先,如果你在該行有斷點,那麼執行將失敗,因爲你的應用程序沒有在前臺運行(你在Visual Studio中,而不是在你的應用程序中),並且鎖屏對話框找不到你的應用程序的主窗口。

在模擬器中運行時會發生另一個問題 - GetAccessStatus上的每個調用都會引發異常,因爲在Simulator中基本不允許此調用。

如果你想調試這個,然後將你的斷點放在GetAccessStatus調用之後,並在本地機器上測試它,它應該工作。

更新,當在非UI線程上調用RequestAccessAsync方法時,我也遇到了這個異常。在UI線程上調用時,它工作正常。

+0

好的,謝謝,這很有道理。但即時通訊不在模擬器中運行。在將執行移入按鈕事件處理程序之後,它可以工作。但我當然想要自動請求鎖屏訪問。有什麼我應該知道的嗎? – Andreas

+0

當一個調用需要封送到另一個線程時,可能會引發類型庫錯誤。請確保您只在程序的主UI線程上運行此代碼。 –

0

您是否已驗證包清單是否具有啓用鎖定屏幕的應用程序所需的所有設置?

我在調用GetAccessStatus時不斷收到異常。在檢查清單文件時,我注意到「鎖定屏幕通知」設置留空。將其設置爲「徽章」或「徽章和瓷磚測試」並選擇徽標徽標解決了異常問題。

0

我在snapped模式(也在模擬器和斷點)有同樣的問題。

我的解決方法是遵循:

  1. 呼叫RequestAccessAsync主網頁應用程序啓動時,例如在OnGotFocus方法之後。
  2. 它只能被調用一次,並且從不以快照模式調用。
  3. 不要試圖在模擬器中執行它。
  4. 不要在此方法上設置斷點。

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

這會幫助你:

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

祝您好運!

+0

依靠延誤並不是一個好的做法 –

+0

對嗎?根據誰? –

+0

因爲您不能確定在任意1000毫秒延遲之後,以下方法調用不會引發異常。這不是一個可以推薦的解決方案,即使它可以工作。 –