Управление экраном блокировки в Windows Phone 8 (часть 1, фоновое изображение)

Одно из нововведений в Windows Phone 8 SDK — возможность интеграции приложений с экраном блокировки устройства. В этой части будет рассмотрена возможность смены фонового изображения. Эта возможность будет полезна для приложений, работающих с изображениями (например, клиенты социальных сетей, приложения для обработки фото и т.д.).

Для того, чтобы приложение стало провайдером фонового изображения экрана блокировки, необходимо это явно указать в манифесте приложения. Без этого все дальнейшие шаги будут невозможны. Кроме того, после задания этого разрешения, приложение появится в списке в системном окне настройки экрана блокировки.

Чтобы задать это разрешение, необходимо открыть файл манифеста приложения в XML-редакторе и добавить туда Extension:

<Tokens>
  <!-- ... -->
</Tokens>
<Extensions>
  <Extension ExtensionName="LockScreen_Background" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" TaskID="_default" />
</Extensions>
<ScreenResolutions>
  <!-- ... -->
</ScreenResolutions>

После того, как манифест был изменен, необходимо сделать сделать три действия: 1) задать фоновое изображение, которое будет использоваться по умолчанию; 2) добавить обработку ситуации перехода к приложению из экрана системных настроек; 3) если это необходимо, изменять фоновое изображение экрана блокировки.

Стандартное фоновое изображение

Когда мы указали, что приложение может быть использовано в качестве провайдера фонового изображения (путем добавления элемента Extension в файл манифеста), оно появится в списке приложений на экране настроек. Пользователь может выбрать это приложение в качестве источника фонового изображение, но само приложение не запустить. В этом случае у приложения нет возможности запустить какой-либо код и инциализировать фоновое изображение. Для таких случаев в приложении можно добавить изображение, которое будет использовано по умолчанию.

Чтобы добавить стандартное фоновое изображение, необходимо в приложение добавить файл с именем DefaultLockScreen.jpg (имя файла должно быть именно таким) и установить для него Build Action в режим Content. Это позволит включить данный файл в пакет приложения. Теперь это изображение будет использоваться в качестве стандартного фонового изображения, когда в приложение будет использовано в качестве провайдера фонового изображения.

Обработка ситуации перехода к приложению из экрана системных настроек

Приложение можно запустить из экрана системных настроек. Для этого нужно нажать кнопку открыть приложение, когда приложение выбрано в списке.

Очевидно, что такую ситуацию нужно обрабатывать, чтобы сразу переходить к настройке фонового изображения. Чтобы добавить такую обработку, на главной странице следует переопределить метод OnNavigatedTo. Если мы перешли к странице сразу после запуска приложения (e.NavigationMode == NavigationMode.New) и существует параметр в QueryString с именем WallpaperSettings и равный 1, то это как раз случай перехода к приложению из настроек. Код для перехода к странице настроек внутри приложения будет выглядеть следующим образом:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
  if (IsNavigatedFromWallpaperSettings(e, NavigationContext.QueryString) == true)
    NavigationService.Navigate(new Uri("/LockScreenSettings.xaml", UriKind.Relative));

  base.OnNavigatedTo(e);
}

private bool IsNavigatedFromWallpaperSettings(NavigationEventArgs e, IDictionary<string, string> queryString)
{
  if (e.NavigationMode == NavigationMode.New)
  {
    string wallpaperSettings;
    return (queryString.TryGetValue("WallpaperSettings", out wallpaperSettings) == true) && (wallpaperSettings == "1");
  }
  else
    return false;
}

Теперь при переходе к приложению из экрана настроек будет открываться страница LockScreenSettings.xaml.

Изменение фонового изображения экрана блокировки из приложения

Прежде чем приложением сможет изменять фон экрана блокировки, следует убедиться используется ли это приложение в качестве источника фонового изображения. Для этого используется объект LockScreenManager. Кроме того, с помощью этого объекта можно запросить у пользователя использовать данное приложение для экрана блокировки. Разместим на главной странице кнопку, которая будет запрашивать данное разрешение. Кнопка будет скрываться, если приложение уже итак используется для экрана блокировки:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
  // ..

  UseAppAsBackground.Visibility = LockScreenManager.IsProvidedByCurrentApplication ? Visibility.Collapsed : Visibility.Visible;

  base.OnNavigatedTo(e);
}


private async void OnUseAppAsBackgroundClick(object sender, RoutedEventArgs e)
{
  LockScreenRequestResult result = await LockScreenManager.RequestAccessAsync();

  if (result == LockScreenRequestResult.Denied)
    MessageBox.Show("Unable to set this app as lock screen background provider.");
  else
    MessageBox.Show("The app is lock screen background provider now.");

  UseAppAsBackground.Visibility = LockScreenManager.IsProvidedByCurrentApplication ? Visibility.Collapsed : Visibility.Visible;
}

Перейдем к странице настроек фонового изображения. Разместим несколько кнопок, каждая из которых будет устанавливать собственное изображение в качестве фона экрана блокировки. Обработчик нажатия по такой кнопке будет иметь следующий код:

private void OnSetBackround1Click(object sender, RoutedEventArgs e)
{
  if (LockScreenManager.IsProvidedByCurrentApplication == true)
    LockScreen.SetImageUri(new Uri("ms-appx:///LockScreen1.jpg"));
}

При этом в проект следует добавить изображения, путь до которых указывается в методе SetImageUri (Build Action = Content).

Таким образом, приложение готово к тому, чтобы устанавливать фоновое изображение экрана блокировки.