Подтвердить что ты не робот

Регистрация кнопки гарнитуры с помощью BroadcastReceiver на Android

У меня есть гарнитура с одиночной кнопкой и вы хотите сделать простой тост при нажатии кнопки.

Сейчас у меня есть следующий код:

public class MediaButtonIntentReceiver extends BroadcastReceiver {

public MediaButtonIntentReceiver() {
    super();
}

@Override
public void onReceive(Context context, Intent intent) {
    String intentAction = intent.getAction();
    if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
        return;
    }
    KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
    if (event == null) {
        return;
    }
    int action = event.getAction();
    if (action == KeyEvent.ACTION_DOWN) {
    // do something
        Toast.makeText(context, "BUTTON PRESSED!", Toast.LENGTH_SHORT).show(); 
    }
    abortBroadcast();
}
}

И моя основная деятельность такова:

public class mainActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver();
    registerReceiver(r, filter); 

}
}

Ничего не происходит, хотя я нажимаю кнопку.

Я уверен, что с моими разрешениями /xml в манифесте что-то не так. Здесь XML-приемник:

    <receiver android:name=".MediaButtonIntentReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>

....

и

<uses-permission android:name="android.permission.BLUETOOTH" /> 

Я заметил в LogCat, что когда я нажимаю кнопку, я получаю сообщение об ошибке "BluetoothIntentReceiver", говорящее "onReceive() Действие: android.intent.action.MEDIA_BUTTON"

4b9b3361

Ответ 1

Просто хотел ответить на мой вопрос, если другие сталкиваются с подобными проблемами.

Код действительно работает, только я не видел Toast, потому что у меня было установлено другое приложение для управления кнопками гарнитуры (и работало в фоновом режиме), поэтому я предполагаю, что это заняло приоритет над моим. Однако, когда я положил

    IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);//"android.intent.action.MEDIA_BUTTON"
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver();
    filter.setPriority(1000); //this line sets receiver priority
    registerReceiver(r, filter);

Он смог работать даже с другим установленным приложением. Кроме того, вам не нужны оба вышеуказанных И XML, то или иное прекрасно, как способы регистрации приемника намерений.

Ответ 2

Вот что я получил, работая в Android 4.2.2

В моем manifest.xml я делаю это:

<receiver android:name=".MediaButtonIntentReceiver">
<intent-filter>
    <action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>

NB: это вместо вызова registerReceiver.

В моей основной деятельности onCreate Мне нужно вызвать AudioManager:

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(
    new ComponentName(
         getPackageName(), 
         MediaButtonIntentReceiever.class.getName()));

Я нашел, что он будет работать без вызова AudioManager, но не надолго!

Ответ 3

Вам не следует использовать setPriority

Вы регистрируете приемник вещания в манифесте

Затем вы регистрируете свой вещательный приемник, используя:

AudioManager # registerMediaButtonEventReceiver

Аргумент registerMediaButtonEventReceiver - это имя компонента, которое указывает ваш широковещательный приемник.

Ответ 5

Если вы не хотите использовать BroadcastReceiver, вы можете сделать это для Android > 5.0 (API уровня 21 LOLLIPOP) с помощью описанной здесь MediaSession: fooobar.com/info/207402/...