Android OSのバージョン4.0.3(ICS)用のAndroidアプリケーションを作成しています。問題は、BroadcastReceiverのonReceive()メソッドでLog.d()からの出力が得られないことです。これは、アプリケーションがブロードキャストを適切に処理していないことを意味します。
ACTION_MEDIA_BUTTONがクリックされたときにコードを実行する方法についての無数の質問を読みました。動作しない場合は、動作するかどうかを確認するために、コードをコピーして貼り付けました。
私が処理したいACTION_MEDIA_BUTTONは、ユーザーが通話をピックアップ/終了したり、音楽を再生/一時停止したりできるイヤホンのsingleボタンです。 アプリケーションがこのボタンを処理する代わりに、ボタンをクリックすると、Nexus S Androidのストックミュージックプレーヤーが曲の再生を開始します。
コードを別のクラスに配置していません。これが機能しない理由かもしれません。
OnCreate()メソッドで見つかったコードは次のとおりです(作成したコードが機能しなかった後にWebサイトからコピーしたこの特定のコード):
IntentFilter mediaButtonFilter = new IntentFilter(
Intent.ACTION_MEDIA_BUTTON);
mediaButtonFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
BroadcastReceiver brMediaButton = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.d("Event", "Media button!");
this.abortBroadcast();
KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if(key.getAction() == KeyEvent.ACTION_UP) {
int keycode = key.getKeyCode();
if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) {
Log.d("TestApp", "Next Pressed");
} else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) {
Log.d("TestApp", "Previous pressed");
} else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
Log.d("TestApp", "Head Set Hook pressed");
}
}
}
};
registerReceiver(brMediaButton, mediaButtonFilter);
私が本当にテストする必要があるのはKEYCODE_HEADSETHOOKだけですが、テスト用に他のコードがそこにあることは問題ありません。すべてが正しく機能するようになったら修正します。
私のマニフェストでは:
<intent-filter Android:priority="2147483647" >
<action Android:name="Android.intent.action.MEDIA_BUTTON" />
</intent-filter>
当初、これには権限を指定しなかったため、これは権限の問題である可能性があると考えていましたが、エラーメッセージは表示されませんでした。
前に言ったように、私はこれの多くのバリエーションを試しました。 1つの例は、このリンクでのコードの使用でした broadcastreceiver onReceive problem ACTION_MEDIA_BUTTON Android CommonsWareの修正。ただし、別のクラスに含まれないように変更しました。
よろしくお願いします。
私はこれをSamsungGalaxyS5でAndroid 4.4.2。でテストしました。重要なことと、他の投稿で言及されていないこと:
さて、ここでいくつかのサンプルコード:
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mReceiverComponent = new ComponentName(this,YourBroadcastReceiver.class);
...
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent);
...
// somewhere else
mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent);
ここでレシーバー:
public static class YourBroadcastReceiver extends BroadcastReceiver{
// Constructor is mandatory
public MediaBroadcastReceiver ()
{
super ();
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Log.i (TAG_MEDIA, intentAction.toString() + " happended");
if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
Log.i (TAG_MEDIA, "no media button information");
return;
}
KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null) {
Log.i (TAG_MEDIA, "no keypress");
return;
}
// other stuff you want to do
}
}
そしてここにmanifestスニペットがあります。必要に応じて、intent-filterの優先順位を追加しますが、私には必要ありませんでした。
<application>
<receiver Android:name="OuterClass$YourBroadcastReceiver">
<intent-filter>
<action Android:name="Android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<activity> ... </activity>
</application>
参考のために:
mediaButtonReceiver = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName());
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mAudioManager.registerMediaButtonEventReceiver(mediaButtonReceiver);
このコードは、電話をかけるまで、ヘッドフォンボタンをアプリとアプリにバインドします。
mAudioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiver);
ここで説明されているMediaSessionを使用して、Android> 5.0(APIレベル21 Lollipop)のBroacastreceiverを使用することを回避できます: https://stackoverflow.com/a/39413753/1386969