読者です 読者をやめる 読者になる 読者になる

hyoromoのブログ

iOS/AndroidもしくはCocos2dxネタを書いています

ロック画面の背景画像を切り替える方法


WindowsPhone8からロック画面の表示内容をアプリ側から変更出来るようになりました。変更出来る内容は以下の2つとなります。

  • ロック画面の背景画像
  • ロック画面の通知領域

今回は背景画像の切り替え方法について書きます。なお、だいたいここ見ればやり方が分かり、本ブログの内容もだいたいそこと同じ内容です。

ロック画面の背景画像を切り替える為の大まかな流れ

WP8から設定アプリに"ロック画面"ページが増えており、そのページ内にある"背景"に設定されたアプリがロック画面の背景切り替え権限を持つアプリとなります。
その為、アプリはまずロック画面の背景切り替え権限をユーザーから得てから、初めて背景画像を切り替える事が可能となります。

  • ロック画面の背景変更する権限を得る → ロック画面の背景変更を行う

ロック画面の背景画像を切り替える為のコード

ロック画面の背景画像切り替え権限を付与

Properties/WMAppManifest.xaml」を「コードを開く」で開き、タグ内に以下を挿入します。

<Extensions>
  <Extension ExtensionName="Photos_Extra_Viewer" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
</Extensions>
ロック画面の背景変更の許可を得る為には


上記画像のようにユーザーに許可を得るまでの処理は以下のようになります。ちなみに他アプリから背景変更された場合、一度許可を得てても再度許可を得る必要があります。

var isProvider = LockScreenManager.IsProvidedByCurrentApplication;
if (!isProvider) {
    // まだ許可を得てない場合、ユーザーに許可を得るためのダイアログを表示
    var op = await LockScreenManager.RequestAccessAsync();
    isProvider = op == LockScreenRequestResult.Granted;
}

if (isProvider) {
    // 許可を得た時の処理
} else {
    // 許可を得られなかった時の処理
}

この処理は定型文となっており、リファレンス上にあるコードと全く同じです。await使っているので、メソッドにはasync付けといてください。

ロック画面の背景変更

背景画像を設定する上でのポイントは1つ、設定する画像はどこのを使うかです。
画像指定時のUri先頭に、アプリ内のリソースを使う場合は"ms-appx:///"、分離ストレージ上の画像を使う場合"ms-appdata:///Local/"とします。

var fileName = "lockScreen.jpg" // ここは任意変更
var uri = new Uri("ms-appdata:///Local/" + fileName, UriKind.Absolute); // 分離ストレージ上のファイルを指定
LockScreen.SetImageUri(uri);

以上で設定完了です。結構簡単ですね。

その他、Tipsとか色々な何か

ロック画面に設定する背景画像の指定先が、分離ストレージだった時に起こる問題

指定するUriが現在指定されているUriと同一の場合はLockScreen.SetImageUriしても無視されます。この事はリファレンス上にも記載されており、Uri名を切り替えて設定すれば解決する...と思いきやそれでも何回かに1回失敗する事があります。
無難な方法としては、分離ストレージ上に保存する画像ファイル名の末尾にunix timeでも付けて毎回異なるパスにすると確実です。

LockScreen.GetImageUri()の罠

このメソッドは現在設定中のロック画面背景画像のUriが絶対パスで取得できます。ただし、自分のアプリが設定している場合のみ取得可能で、自分以外が設定している場合に実行するとエラーになります。
try/catchでもいいかもしれませんが、使う前に LockScreenManager.IsProvidedByCurrentApplication でチェックしておくのが無難。

アプリ名を多言語対応した時の罠


アプリ表示名を多言語対応した場合、WMAppManifest.xmlの表示名 項目には「@AppResLib.dll,-100」と書きます。そうした場合、設定アプリのロック画面ページ上に表示されるアプリ名が画像のようなパス表示となってしまします。。。が解決方法は分かりません。

エミュレータ上でロック画面を表示するには

F12

追記(2012/12/02)

Manifestの事を忘れていたので追加。