1

電話がディープ スリープ モードのときに、音量アップ/ダウンのプレス イベントをキャッチしようとしています。私はいくつかの記事を読みましたが、ここで私がやったことです。

アクティビティonCreateメソッドでは、WakeLock

PowerManager mgr = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();

これを設定すると、画面がロックされていても、アプリケーションがイベントに応答することを読みました。また、Android マニフェストにアクセス許可を追加しました。

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

次に、onCreateメソッドでブロードキャストレシーバーを宣言します

VolReceiver volumeBroadcastReceiver = new VolReceiver();

IntentFilter filter = new IntentFilter();
filter.addAction("android.media.VOLUME_CHANGED_ACTION");
registerReceiver(volumeBroadcastReceiver, filter);

これはすべて非常にうまく機能し、アプリケーションはフォアグラウンドまたはバックグラウンドにありますが、電源ボタンを押して携帯電話の画面をロックし、アプリケーションのブロードキャストイベントの受信を停止しますPowerManager。この問題を解決する必要があると思いますが、そうではありません. だから私を助けてください、いくつかの情報を提供してください。

4

2 に答える 2

2

電話がディープスリープモードのときに音量アップ/ダウンプレスイベントをキャッチしようとしています。

定義上、それは不可能です。

Activities onCreateメソッドで、WakeLockを設定しました

その後、スリープモードではありません。

次に、電源ボタンを押して電話の画面をロックします。アプリケーションはブロードキャストイベントの受信を停止します

ここにはいくつかの可能性があります。1つは、プロセスが不要になったため、プロセスが終了したことです。フォアグラウンドアクティビティがなくなると、プロセスを終了して他のアプリのメモリを解放する資格があります。これはいつでも発生する可能性があります。もう1つの可能性は、画面がオフのときにAndroidがそのブロードキャストを送信しないことです。

于 2012-11-06T11:55:19.583 に答える
2

私はほとんど同じことをしましたが、ソースコードを変更することでそれを達成しました。以下で説明しました。

携帯電話がスリープ状態になるたびに、MediaPlaybackService.javaは keyEvents をリッスンしませんが、MediaButtonIntentReceiver.javaはリッスンするため、ここで音量の上下のインテントを受信し、インテントをブロードキャストしてMediaPlaybackService.javaで受信しますが、1 つのことを保持します。ここから UI を変更することはできないため、サービスから別のインテントをブロードキャストして、MediaPlaybackActivity.javaにそれを受信させることができます。これにより、画面が起動するとすぐに UI が変更されます。

参考: 画面がオフの場合、PhoneWindowManager.javaはすべての継続的なインテントをキューに入れ、ボタンを放すとすぐにすべてのインテントを一度に適用します。

于 2012-11-06T10:22:58.860 に答える