2016-08-06 42 views
0

私のアプリは長いバックグラウンドサービスを持っています。私はSCREEN_ONSCREEN_OFFアクションを扱う放送受信機に私のサービスを登録しました。しかし、この方法を使用する際の問題は、電話が着信、電源ケーブルのプラグインイベントまたはalarmmanagerなどによって呼び起こされるたびに、動作している間にも、SCREEN_ONアクションがトリガーとなり、その必要がないということです。Androidの電源ボタンイベントを取得する

バックグラウンドサービスのみが実行されているときに、電源ボタンのクリックイベントを「物理的に」キャプチャすることは可能ですか?私は電源ボタンを無効にしようとしていません。

答えて

0

既存の回答では完全に質問に答えず、詳細な調査をせずにはうまくいかないほどの詳細は除外しています。私はこれを解決することを学んだことを分かち合うつもりです。

あなたがマニフェストファイルに次の権限を追加する必要があります:まず、短期および長期プレスを処理するために

<uses-permission android:name="android.permission.PREVENT_POWER_KEY" /> 

は、あなたの活動のクラスに次のオーバーライドを追加します。

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_POWER) { 
     // Do something here... 
     event.startTracking(); // Needed to track long presses 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_POWER) { 
     // Do something here... 
     return true; 
    } 
    return super.onKeyLongPress(keyCode, event); 
} 

注:それはあります価値があることに気づく価値がありますonKeyLongPressの前にonKeyDown()が複数回起動するので、onKeyUp()または他のロジックをトリガーして、一連のonKeyDown()コールがユーザの行動であることを防ぐことができますそれを押さえている。

この次の部分はCyanogenmodのみです。 PREVENT_POWER_KEY定数が定義されていない場合は、それを必要としません。

getWindow().clearFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY); 

あなたは切り替えることができます:電源キーを傍受停止する

getWindow().addFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY); 

(標準機能を許可):

は、あなたがあなたの活動から、次のフラグを設定する必要があり、電源キーを傍受開始するには必要に応じて、プログラム内で2つのモードの間を前後に繰り返します。

参照:あなたの応答のための https://stackoverflow.com/a/10365166/2724418

+0

感謝。しかし、あなたの答えは、アクティビティが実行されている場合にのみ機能します。私の必要条件は、バックグラウンドサービスのみが実行されている場合です。 – hal0360

関連する問題