ShiftCrops つれづれなる備忘録

CTF関連の事やその他諸々

goToSleep()?

ついこの間、学校でAndroid君をいじっていたら、教師に電源を切るよう怒られましたorz

別に電源を切ること自体はなんでもないんですが、やることいっぱいで忙しいこのときにリブートには時間がかかるわけですよ、、、

なので、こんなときのためのジョークアプリ作ってみましたww

 

単にシャットダウンダイアログを出してスリープにする、とういうだけの作業だったのですが、意外と苦労しました。

それは、スリープに移行する権限をuses-permissionでは指定できないから!!

本来なら、AndroidをスリープさせるgoToSleepはPowerManagerに含まれているので、『android.permission.DEVICE_POWER』を許可してやりゃいい筈なんですが・・・

ERROR:user *** nor process doesn't have permission "android.permission.DEVICE_POWER".

あれま。

どうやら、goToSleep()はシステムからしか操作できないようで

 

だったら、別の方式で攻めましょう。

バックライト点灯時間の操作です。

[java] if*1==-1) finish(); halting = new ProgressDialog(this);

AlertDialog.Builder confirm = new AlertDialog.Builder(this); confirm.setIcon(android.R.drawable.ic_dialog_alert); confirm.setTitle("電源を切る"); confirm.setMessage("携帯電話の電源を切ります。");

[/java]

システムのバックライト消灯時間を頭で取得して、その後ダイアログを出します。

[java]

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 500);

[/java]

ひとまずこれで消灯時間を500ミリ秒にして、、、

[java] @Override public void onPause(){ super.onPause(); halting.dismiss(); halting = null; }

@Override public void onDismiss(DialogInterface arg0) { // TODO Auto-generated method stub Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, defTime); finish(); }

[/java]

消灯後にonPauseでダイアログを消し、onDismissでそれに続いて設定を戻して終了です。

これは『android.permission.WRITE_SETTINGS』を必要としますので、少々インストールを拒みたくなりますが、怖いことはしてないので安心してくださいww ものはこれ です。

*1:defTime = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, -1