問題の説明
アプリケーションが起動しているときに、音量アップ/ダウンと Bluetooth ヘッドセット ボタンの押下をキャッチするアプリケーションを作成しようとしています。
- バックグラウンド
- 前景
- 背景と電話がスリープ モードになっている (電源ボタンが押されている)
- フォアグラウンドで電話がスリープ モードになっている (電源ボタンが押されている)
最初の 2 つの点については、いくつかのテスト アプリケーションを作成しました。私の場合はすべてが機能します。アプリケーションをバックグラウンドに送信し、ボリュームを上下に押すと、アプリケーションがこのイベントをキャッチします。電源ボタンを押した後、電話がスリープモードになります。次に、音量を上げる/下げるボタンを押しても、電話はそのイベントに反応しません。すべてが機能しなくなったように、logcat にログが表示されません。
スリープ モードでのキー押下を検出するアプリケーション。
この問題は解決できないと思いますが、音楽の再生中に音量の上下ボタンを押すと、Android 標準の Media Player がこのイベントをキャッチすることを覚えています。このアプリはシステムアプリなのでそれができると思いますが、Winpmプレーヤーをダウンロードすると同じように動きます。Winapm は、電話がスリープ モードのときに音量アップ/ダウン イベントをキャッチします。音楽プレーヤー アプリケーションはそれを行います。
質問
これを行う方法を理解したいですか?ボリュームアップ/ダウンボタンの押下をキャッチする簡単なアプリケーションを作成する方法. その時に音楽を演奏する必要がありますか、それともできますか? つまり、Winamp やその他のアプリケーションがそのイベントをキャッチする主な理由は、その時点で音楽が再生されていることです。それとも、この問題は解決できないのでしょうか?解決できない場合は、その理由を知りたいですか? なぜ解決できないのか、いくつかの議論が必要です。
ソースコード
私はいくつかのアプリケーションをテストしました。結果は次のとおりです。バックグラウンドとフォアグラウンド、およびアプリケーションがスリープモードのときに、ボリュームの上下キーの押下をキャッチする簡単なアプリケーションを作成しました。アプリケーションがバックグラウンドとフォアグラウンドの場合、すべてが完璧に機能し、私のテストアプリケーションはイベントをキャッチしますが、電源ボタンを押すと停止し、メディアプレーヤーで開始を押すと、電源ボタンを押した後に音楽の再生が開始されますもう一度音量を上げてから下げると、アプリケーションの統計が音量の上下のキープレスをキャッチします。音楽が再生されると、アプリケーションはそのイベントをキャッチできるので、次の質問は、携帯電話が音楽を再生するようにシミュレートする方法です。これは解決策でしょうか?
マニフェスト.xml
<receiver android:name="com.vito.backgroundworker.VolumeBroadcast" android:enabled="true">
<intent-filter>
<action android:name="android.media.VOLUME_CHANGED_ACTION" />
</intent-filter>
</receiver>
<receiver android:name="RemoteControlReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
MainActivity.java
public class MainActivity extends Activity {
private PowerManager.WakeLock wl;
//private BroadcastReceiver vol = new VolumeBroadcast();
private AudioManager mAudioManager;
private ComponentName mRemoteControlResponder;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mRemoteControlResponder = new ComponentName(getPackageName(),
RemoteControlReceiver.class.getName());
}
@Override
protected void onPause() {
super.onPause();
mAudioManager.registerMediaButtonEventReceiver(
mRemoteControlResponder);
wl.release();
}//End of onPause
@Override
protected void onResume() {
super.onResume();
wl.acquire();
}//End of onResume
@Override
public void onDestroy() {
super.onDestroy();
mAudioManager.unregisterMediaButtonEventReceiver(
mRemoteControlResponder);
}
}