[メモ] Androidアプリ内からの端末[ON]→[スリープ]について

久しぶりに開発関連のメモ。

ちょっと必要があって、自作アプリの内で、画面のON→OFFおよびOFF→ONを自動的に実行したいと思って調べました。

で、後者のOFF→ONについては、
http://into.cocolog-nifty.com/pulog/2012/01/android059-7570.html
こんな感じで、WakeLockを使ってやれば実行できます。
さらには、これを

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

IntentFilter scOffFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
registerReceiver(
screenOffReceiver,
scOffFilter);

}

@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(screenOffReceiver);
}

/**
* 画面OFFのIntentを感知するBroadcastReceiver
*/
private class ScreenOffReceiver extends BroadcastReceiver {
@Override
public void onReceive(
Context context,
Intent intent) {
Log.d("ScreenOffReceiver","Intent Called!");

if (
wakeLock != null &&
wakeLock.isHeld() ) {
wakeLock.release();
}

wakeLock =
((PowerManager)getSystemService(Context.POWER_SERVICE)).newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
getApplication().getPackageName());
wakeLock.acquire();
wakeLock.release();


}
}

こんな感じで、SCREEN_OFFを受け取るbroadcastを設定した場所で処理してやることで、画面が切られた(物理スイッチが押下された)後で、すぐに画面を起動させる、といった、単純に自動スリープをオフにするだけとは違った形で、常時画面をONにした状態を保つことができます。

この部分までは知っていたので、これと同じような要領で、ON→OFFについてもできるのだろう、と思って調べたところ、これが中々難物であることが分かりました。
まず、基本的にはやり方として PowerManager クラスに、wakeUpというメソッドが用意されています。
これを使えばいいんだ、と簡単に考えていたところ、Ecripseでこのコードを書いてしまうと、DEVICE_POWERパーミッションが必要だ、と言われます。
そこで、このパーミッションを追加すると、今度は、「このパーミッションはsystemアプリにしか許可されていない」といった主旨の文言が表示されてエラーとなります。

色々調べたところ
http://stackoverflow.com/questions/15556508/android-how-to-use-powermanager-wakeup
http://www.techdoctranslator.com/android/guide/device-admin
http://d.hatena.ne.jp/pochi-p/20120617
http://subtech.g.hatena.ne.jp/cho45/20100205/1265367008
Manifestファイル内で通常設定するuses-permissionの他に、permissionを設定し、アプリのprotectionLevelをsignatureOrSystemまたはsystemにしなければいけないようです。
http://developer.android.com/intl/ja/reference/android/Manifest.permission.html

ただし、これらの設定はその名前から想像できる通り、systemアプリにしか許可されていないもの。
ということで、通常のやり方では、Googleやスマートフォンメーカーなどのアプリ以外のサードパーティーアプリでは、画面ON→OFFという機能は実装できない。ということが分かりました。

ところが、色々調べて見ると、世の中には以外とこの手のアプリが流通してます。
http://www.android-mutant.net/article/366416352.html
https://play.google.com/store/apps/details?id=jp.co.kixx.tool.offwidget&hl=ja
http://octoba.net/archives/20130908-android-app-gravity-screen-on-off-214242.html

この手のアプリ、ほとんどが「デバイス管理者権限」を設定できる必要があり、中には、そういったことにかこつけて、こんな危険そうなアプリもある様で…
http://secroid.jp/d/0/7/d/com.thanhnv.screenoff.html

この手のアプリをインストールする際は、ちょっと慎重になったほうがいいのかも。
そして私は他の解決策を探ることにします…


では。


Learning Android: Develop Mobile Apps Using Java and Eclipse
Oreilly & Associates Inc
Marko Gargenta

amazon.co.jpで買う
Amazonアソシエイト by Learning Android: Develop Mobile Apps Using Java and Eclipse の詳しい情報を見る / ウェブリブログ商品ポータル



炎のAndroid開発道場
リックテレコム
よちよちAndroidサンデープログラミングの会 初心者教育委員会

amazon.co.jpで買う
Amazonアソシエイト by 炎のAndroid開発道場 の詳しい情報を見る / ウェブリブログ商品ポータル



プロの力が身につく Androidプログラミングの教科書
ソフトバンククリエイティブ
藤田 竜史

amazon.co.jpで買う
Amazonアソシエイト by プロの力が身につく Androidプログラミングの教科書 の詳しい情報を見る / ウェブリブログ商品ポータル


この記事へのコメント

この記事へのトラックバック

テーマ別記事