4

次の方法を使用して、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();

コードは実行されますが、次の例外がスローされます。

タイプ'System.Exception'の未処理の例外がmscorlib.dllで発生しました追加情報:要素が見つかりません。(HRESULTからの例外:0x8002802B(TYPE_E_ELEMENTNOTFOUND))

別の投稿で読んだように、これは他の人に知られているバグであり、Microsoftについては知りません。この行の前にブレークポイントを配置しないと、代わりに実行がハングします。私はここで何が間違っているのですか?

アプリケーションをアンインストールすると機能するようですが、再実行すると最終的には再び失敗します。

4

4 に答える 4

6

ロックスクリーンアクセスのためにアクセスするときに私が知っている2つのバグがあります。まず、その行にブレークポイントがある場合、アプリケーションがフォアグラウンドで実行されておらず(アプリではなくVisual Studioを使用している)、ロック画面ダイアログがアプリのメインウィンドウを見つけることができないため、実行は失敗します。

シミュレーターで実行すると、別の問題が発生します。この呼び出しは基本的にシミュレーターでは許可されていないため、GetAccessStatusのすべての呼び出しは例外をスローします。

これをデバッグする場合は、GetAccessStatus呼び出しの後にブレークポイントを配置し、ローカルマシンでテストすると、正常に機能するはずです。

更新、RequestAccessAsyncメソッドが非UIスレッドで呼び出されたときにもこの例外が発生していました。UIスレッドで呼び出された場合、正常に機能しました。

于 2012-09-29T08:09:24.347 に答える
0

パッケージマニフェストに、ロック画面対応アプリに必要なすべての設定が含まれていることを確認しましたか?

GetAccessStatusを呼び出すと、例外がスローされ続けました。マニフェストファイルを調べたところ、「ロック画面の通知」設定が空白のままになっていることに気付きました。「バッジ」または「バッジとタイルのテスト」に設定し、バッジのロゴを選択すると、例外の問題が解決しました。

于 2013-01-22T20:25:59.220 に答える
0

スナップモードでも同じ問題があります(シミュレーターとブレークポイントでも)。

私の回避策は次のとおりです。

  1. たとえばOnGotFocusメソッドで、アプリの起動直後にメインページでRequestAccessAsyncを呼び出します。
  2. 一度だけ呼び出す必要があり、スナップモードでは呼び出さないでください。
  3. エミュレータで実行しようとしないでください。
  4. このメソッドにブレークポイントを設定しないでください。

    private bool _isAccessRequested;
    protected override void OnGotFocus(RoutedEventArgs e)
    {
        if (!_isAccessRequested)
        {
            _isAccessRequested = true;
            BackgroundExecutionManager.RequestAccessAsync();
        }
    }
    
于 2013-05-08T11:35:18.640 に答える
0

これはあなたを助けるはずです:

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

頑張ってください!

于 2014-05-12T01:59:22.533 に答える