Не удается заставить работать 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

Другие вопросы по тегам