2013-04-12 3 views
5

У меня есть простое, но, вероятно, плохо структурированное приложение для Android. Он состоит из двух классов java: MainActivity, расширяющих Activity, и RemoteControlReceiver, который расширяет BroadcastReceiver.BroadcastReceiver для ACTION_MEDIA_BUTTON намерений стреляет ДВАДЦАТЬ в MediaButton нажмите

Я следовал инструкциям в следующих двух ссылок, чтобы настроить приемник Mediabutton: http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html http://developer.android.com/training/managing-audio/volume-playback.html

Вопрос заключается в том, что всякий раз, когда я нажимаю кнопку мультимедиа (воспроизведение/пауза, следующая, предыдущая) на мой bluetooth remote, метод onReceive() broadcastReceiver выполняется дважды. Или, более конкретно, весь RemoteControlReceiver инициализируется в объект, запускается метод onReceive() объекта, объект обрывается и повторяется.

Я испытал это, поставив статический int mult = 0; в MainActivity. Я увеличил число на 1 при каждом запуске onReceive. И он увеличивается на два нажатия кнопки.

Я не уверен, что заставляет его работать дважды. Является ли аппаратное обеспечение двойным сигналом на клик, или же ОС посылает несколько мультимедийных кнопок на один сигнал, или мой транслятор вещания работает дважды за каждое намерение?

Мой MediaButtonReceiver код:

public class RemoteControlReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())){ 
      KeyEvent Xevent = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
      int keyType = Xevent.getKeyCode(); 



      Intent i = new Intent(); 
      i.setAction("com.MainActivity.Shakey.MEDIA_BUTTON"); 
      i.putExtra("keyType", keyType); 
      context.sendBroadcast(i); 
      Toast.makeText(context, String.valueOf(MainActivity.mult), Toast.LENGTH_SHORT).show(); 
      MainActivity.mult++; 
      abortBroadcast(); 

     } 

    } 
} 

фильтр данного ресивера зарегистрирован в Manifest следующим образом:

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

BroadcastReceiver динамически зарегистрирован объект AudioManager в onResume в MainActivity (в) , И он незарегистрирован в onPause(). Поскольку ссылки говорят, что это верный способ получить 1-й приоритет в отношении медиа-контента. Я знаю, что могу игнорировать каждый раз звонок трансляционного вещателя с помощью статической переменной. Но я хотел бы знать причину этой проблемы.

PS Кнопки play/pause/previous/next отлично работают для музыкального плеера по умолчанию для Android.

ответ

12

На мой взгляд проблема заключается в том, что OnReceive реагирует на нажатие и отпускание кнопки Bluetooth. Вот почему ваш код работает 2 раза. Попытайтесь сделать это так:

if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
    KeyEvent Xevent = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);  
    if ((KeyEvent.KEYCODE_MEDIA_PLAY == Xevent.getKeyCode()) && (Xevent.getAction() == KeyEvent.ACTION_DOWN)) { //MainActivity.mult++; ... 

Или вы можете использовать ACTION_UP, несмотря на то, что вы хотите сделать. Я не уверен, но я надеюсь, что это поможет вам.

+0

* doh * Yup это был! Я отставлен>. <;; Спасибо – user2275463

Смежные вопросы