ACTION_MEDIA_BUTTON не работает в BroadcastReceiver
Это продолжение моего предыдущего вопроса здесь.
Я использую Android SDK 26 на Samsung Galaxy S7 под управлением Android v8 и пытаюсь использовать кнопку воспроизведения / паузы (HEADSETHOOK, код клавиши 79) на наушниках. Следуя предложениям @Commonsware и @Pawel, я зарегистрировал ресивер в основной деятельности, и теперь он работает, поскольку он распознает, когда наушники подключены / отключены от телефона. Тем не менее, несмотря на то, что он может захватывать нажатие кнопки при использовании onKeyDown на переднем плане, он не распознается BroadcastReceiver как ACTION_MEDIA_BUTTON (или что-либо еще, насколько я могу разобрать). Все, что происходит, это то, что приложение по умолчанию (Google Assistant) вызывается, когда я нажимаю долго, а при коротком нажатии ничего не происходит.
Вот мой код (все содержится в одном классе):
public class MainActivity extends AppCompatActivity {
private BroadcastReceiver headsetBtnReceiver;
private AudioManager mAudioManager;
private ComponentName mReceiverComponent;
Intent playerService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
headsetBtnReceiver = new RemoteReceiver();
Log.e("Udp SVC", "Registering Receiver ");
IntentFilter mediaFilter = new IntentFilter();
mediaFilter.setPriority(2148675);
mediaFilter.addAction(Intent.ACTION_HEADSET_PLUG); // <-- Working
mediaFilter.addAction(Intent.ACTION_MEDIA_BUTTON); // <-- Not working
mediaFilter.addAction(Intent.ACTION_SEARCH); // <-- Not working
mediaFilter.addAction(Intent.ACTION_SEARCH_LONG_PRESS); // <-- Not working
registerReceiver(this.headsetBtnReceiver, mediaFilter);
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mReceiverComponent = new ComponentName(getApplicationContext(), RemoteReceiver.class);
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent);
}
@Override
public void onDestroy() {
Log.e("UDP svc", "Destroying MainActivity");
mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent);
unregisterReceiver(headsetBtnReceiver);
finish();
super.onDestroy();
}
public static class RemoteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Log.e("Udp SVC","Into BroadcastReceiver : "+intentAction.toString());
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
final KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event != null && event.getAction() == KeyEvent.KEYCODE_HEADSETHOOK) {
Log.e("Udp SVC","BroadcastReceiver headsethook ");
/***************
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
context.startService(new Intent(context, PlayerService.class));
break;
}
**********/
}
}
}
}
}
- Что (если что) я делаю не так?
- Что такое постоянная Intent для HEADSETHOOK (код ключа 79)?
Если такой константы нет, возможно ли добавить определенный код ключа в IntentFilter?
Помогите!!
1 ответ
добавить в
реализацию зависимостей build.gradle 'androidx.core:core:1.3.1'
реализацию 'androidx.media:media:1.2.0'
затем в вашей деятельности службы переднего плана:
MediaSessionCompat mediaSession = new MediaSessionCompat(this, getPackageName());
mediaSession.setActive(true);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
mediaSession.setCallback(new MediaSessionCompat.Callback() {
@Override
public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
// do somethign with intent here
return super.onMediaButtonEvent(mediaButtonIntent);
}
});
}
И, конечно же, не спрашивайте, почему Google меняет все свои API каждый раз, когда выпускает новую версию Android. Они хотят следовать своим «лучшим практикам», хотя понятия не имеют, как проектировать API, не говоря уже об операционной системе.