マーケットにあるステキなメディアプレーヤーさん方
使っていて疑問に思ったのが、どうやってロック画面より上に表示してるんだ?
と思ってググったら見つかったので試してみます。
明日の鍵 「スクリーンロックを解除する方法」
superdry memorandom :-D [memo]Androidアプリ側からスクリーンロックを解除し、画面表示する方法
どうやら、KeyguardManager.KeyguardLockのdisableKeyguard()で、ロック解除。
reenableKeyguard()で再度有効化、のようです。
何も考えず上記ブログで作られていた
クラスを丸パクリし、ResumeでgetUnlock/PauseでreleaseUnlockを呼びました。
そして
- アプリ起動
- 電源ボタンを押下
- 結果として、確かにロック画面より上にActivityが表示される
が、所詮丸パクリのため、一連の動作一回目の電源ボタン押下後に、
何もしていないのに液晶が明るくなって、Activityが表示されます。
二回目以降は問題ないのですが…
どうやら、起動直後のOnResume時にWakelock.acquire(); を読んでいるのが駄目なようです。
ログを見るかぎりは
- 起動直後のOnResumeでacquire()(※)
- 電源ボタン押下時のOnPauseで、Wakelock.release()
- なぜかOnResumeが走る
なので借り物のクラスをキーロック時のみacquireを呼ぶように修正
これでとりあえずはOKでした。
public void getUnlock() {
// acquire wake lock
_log( "getUnlock:called");
PowerManager pm = (PowerManager) mContext.getSystemService( Context.POWER_SERVICE);
mWakelock = pm.newWakeLock( PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "ScreenLockManager");
// 今回の呼び出し環境だと、ここにあると困る
// mWakelock.acquire();
// unlock screen
KeyguardManager km = (KeyguardManager) mContext.getSystemService( Context.KEYGUARD_SERVICE);
mKeyguardLock = km.newKeyguardLock( "ScreenLockManager");
if( km.inKeyguardRestrictedInputMode()){
// ここに移動
mWakelock.acquire();
mKeyguardLock.disableKeyguard();
isScreenLock = true;
_log( "getUnlock: disableKeyguard");
}else{
isScreenLock = false;
}
}
と、ここまでやってみて一つの疑問が。
PowerManagerでWakeLockを制御する必要は本当にあるのか??
ってことです。
上記以外にも、画面を明るくするために…として呼んでいるソースを見かけるのですが、
そもそも
- スリープ(というのかな?画面暗転)状態で電源ボタン押下すれば、そもそも明るくなる
というわけでPowerManager.WakeLock関連全コメントアウトして試してみました。
結果として、何の問題もありませんでした…
個人的には、何故か暗転したままってのを期待したのですが、普通に動いてしまった…
package com.omokageru.ak.screenunlocktest;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
public class ScreenUnlockTest extends Activity {
private ScreenLockManager slm = null;
/** Called when the activity is first created. */
@Override
public void onCreate( Bundle savedInstanceState) {
super.onCreate( savedInstanceState);
setContentView( R.layout.main);
_log( "onCreate");
slm = new ScreenLockManager( this);
}
@Override
protected void onDestroy() {
// TODO 自動生成されたメソッド・スタブ
super.onDestroy();
_log( "onDestroy");
}
@Override
protected void onPause() {
// TODO 自動生成されたメソッド・スタブ
super.onPause();
_log( "onPause");
slm.releaseUnlock();
}
@Override
protected void onResume() {
// TODO 自動生成されたメソッド・スタブ
super.onResume();
_log( "onResume");
slm.getUnlock();
}
private void _log( String str) {
Log.d( "ScreenUnlockTest Activity", str);
}
}
/**
* 以下パクリもの
*/
class ScreenLockManager {
private Context mContext;
private KeyguardManager.KeyguardLock mKeyguardLock;
private boolean isScreenLock;
public ScreenLockManager( Context context) {
mContext = context;
}
public void getUnlock() {
_log( "getUnlock:called");
// unlock screen
KeyguardManager km = (KeyguardManager) mContext.getSystemService( Context.KEYGUARD_SERVICE);
mKeyguardLock = km.newKeyguardLock( "ScreenLockManager");
if( km.inKeyguardRestrictedInputMode()){
// ここに移動
mKeyguardLock.disableKeyguard();
isScreenLock = true;
_log( "getUnlock: disableKeyguard");
}else{
isScreenLock = false;
}
}
public void releaseUnlock() {
_log( "releaseUnlock:called");
// release screen
if( isScreenLock){
mKeyguardLock.reenableKeyguard();
isScreenLock = false;
_log( "releaseUnlock: reenableKeyguard");
}
}
private void _log( String str) {
Log.d( "ScreenLockManager", str);
}
}
う~ん、ロック解除に関してPowerManagerの利用はどんな意味があるのだろう?
もうちょっと(覚えていたら)調べてみようかな