NO_NAME

適当に技術・仕事・ライフハックの話を書いていく予定です。

ロック画面の上にActivityを表示する

ロック画面にAppWidgetを表示する方法を調べたがそんな方法は存在しないようだ。
かわりにロック画面の上にActivityを表示することができることがわかったのでその方法について書く。

ロック画面の上にActivityを表示するには以下のようにフラグを付けるだけでよい。

getWindow().addFlags(
	WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
	| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

ただし、XPeria SO-01Bではうまく行かず、KeyguardManagerのdeperecatedのメソッドを使う必要があった(この 2.3.7 では非deprecatedで、4.0.1 ではdeprecatedであること確認)。

final KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
final KeyguarrdLock keyguardLock = keyguardManager.newKeyguardLock("app" /* アプリ名など */);
keyguardLock.disableKeyguard();

この方法を利用する場合、 android.permission.DISABLE_KEYGUARD パーミッションが必要になるので忘れないように。

ロック画面周りの挙動パターン(おまけ)

ロック画面周りの動きはAndroidのバージョンによって変わったり、Javadoc通りに動かなかったりするので試した限りのパターンを記述しておく。

  • スライド式のロックの場合(Galaxy Nexus)
    フラグとして WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD を指定してもキーガードが無効にならず、別のActivityに移る際にロック画面が表示されてしまう。Javadocでは WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD はセキュリティー付きのキーガードでない場合、キーガードを無効にすると書いてあるので、Javadocに反していると思う。
  • ロックなしの場合(Galaxy Nexus)
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD を指定しているとキーガードが無効になってしまっているため、音量ボタンなどでも電源がONになってしまうので注意。
  • パターン式などセキュリティ機能付きのロックの場合(SO-01B)
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED や WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD を指定していてもロック画面上にActivityが表示されない。そのため、先ほど述べた方法をとる必要がある。
  • スライド式のロックの場合(S0-01B)
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED や WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD がJavadoc通りに動作。