Не удается заставить работать BroadcastReceiver
Я хочу использовать кнопку HEADSETHOOK (код клавиши 79) на своих наушниках Samsung, но не могу заставить ее работать. Я, по существу, следую за ответом, данным в этом вопросе. Мой телефон - Samsung Galaxy S7 под управлением Android v8.
Соответствующая часть моего манифеста:
<receiver android:name=".MainActivity$HeadsetBtnReceiver" android:enabled="true" >
<intent-filter android:priority="10000000" >
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Моя активность (включая BroadcastReceiver):
public class MainActivity extends AppCompatActivity {
static AudioManager mAudioManager;
static ComponentName mReceiverComponent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mReceiverComponent = new ComponentName(this, HeadsetBtnReceiver.class);
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent);
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onBackPressed() {
Log.e("Udp", "Backpress MainActivity");
finish();
}
@Override
public void onDestroy() {
Log.e("UDP svc", "Destroying MainActivity");
mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent);
finish();
super.onDestroy();
}
public static class HeadsetBtnReceiver extends BroadcastReceiver {
// Constructor is mandatory
public HeadsetBtnReceiver()
{
super ();
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Log.e("Udp svc", intentAction.toString() + " happened");
if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
Log.e("Udp svc", "no media button information");
return;
}
KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null) {
Log.e("Udp svc", "no keypress");
return;
}
KeyEvent key = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
Log.e("UDP svc", "KeyEvent : ");
if(key.getAction() == KeyEvent.ACTION_UP) {
int keycode = key.getKeyCode();
if(keycode == KeyEvent.KEYCODE_MEDIA_NEXT) {
Log.e("Udp svc", "Next Pressed");
} else if(keycode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) {
Log.e("Udp svc", "Previous pressed");
} else if(keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
Log.e("Udp svc", "Head Set Hook pressed");
}
}
}
}
}
Когда я запускаю приложение, я не получаю сообщений Logcat, все, что происходит, - это то, что я получаю действия по умолчанию как для кнопок регулировки громкости, так и для другой отдельной кнопки.
Я считаю, что BroadcastReceiver устарел в пользу MediaSession, но, насколько я могу судить, распознает только кнопки громкости.
Что я делаю неправильно?
1 ответ
Переместите ваш приемник из манифеста в обычный объект-получатель. Вы зарегистрируетесь во время выполнения. Получатели широковещательных рассылок, объявленные в манифесте, больше не работают с Android O (за исключением нескольких случаев).
Как часть пределов фонового выполнения Android 8.0 (уровень API 26), приложения, предназначенные для уровня API 26 или выше, больше не могут регистрировать приемники широковещания для неявных широковещаний в своем манифесте.
Более подробная информация: https://developer.android.com/about/versions/oreo/background