マーケットにあるステキなメディアプレーヤーさん方
使っていて疑問に思ったのが、どうやってロック画面より上に表示してるんだ?
と思ってググったら見つかったので試してみます。
明日の鍵 「スクリーンロックを解除する方法」
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の利用はどんな意味があるのだろう?
もうちょっと(覚えていたら)調べてみようかな
0 件のコメント:
コメントを投稿