2014-08-03 15 views
2

Я пытаюсь добавить простой широковещательный приемник в свое аудио приложение, чтобы я мог отключить все, когда пользователь нажимает на их ACTION_MEDIA_BUTTON на своей гарнитуре. Я читал, что вы можете либо зарегистрировать его в манифесте, либо динамически в коде. Я пошел по пути регистрации его в коде, так как мне нужно вызвать методы в моем основном классе активности, чтобы реагировать на нажатие кнопки мультимедиа. По какой-то причине, однако, мой BroadcastReceiver просто не регистрируется, и я не могу найти ничего, что объясняет, почему (седые волосы растут).Android BroadcastReceiver не регистрируется

Ниже то, что я имею в MainActivity.java:

public class MainActivity extends Activity { 

    public IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); 

    public BroadcastReceiver MediaButtonIntentReceiver = 
      new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, Intent intent) { 

        String intentAction = intent.getAction(); 
        if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 
         KeyEvent event = (KeyEvent) intent 
           .getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
         int action = event.getAction(); 
         if (action == KeyEvent.ACTION_DOWN) { 

          Log.e("INFO", "Media Button Pressed"); 
          MuteAll(); 

         } 


       } 
      } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);  

     // Register media button event receiver 
     intentFilter.addAction("android.intent.action.ACTION_MEDIA_BUTTON"); 
     intentFilter.setPriority(10000); 
     this.registerReceiver(MediaButtonIntentReceiver, intentFilter); 

     } 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    // Unregister media button event receiver 
    unregisterReceiver(MediaButtonIntentReceiver); 

    } 
}; 

Я уверен, что BroadcastReceiver не регистрируется, так как оберточный регистр, как показано ниже дает мне тост, подтверждающему это нуль:

if (registerReceiver(MediaButtonIntentReceiver, intentFilter) == null) 
    { 
     Toast.makeText(this, "Could not register receiver", Toast.LENGTH_LONG).show(); 
    } else { 
     Toast.makeText(this, "Receiver registered", Toast.LENGTH_LONG).show(); 
    } 

EDIT: Я также попытался следующие на основе предложений до сих пор:

прочитывая - http://developer.android.com/training/managing-audio/volume-playback.html Я пытался регистрацией ресивера в манифесте, как так ...

<receiver android:name="com.mydomain.myapp.MainActivity$MediaButtonIntentReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.MEDIA_BUTTON" /> 
    </intent-filter> 
</receiver> 

And then added the following example code: 
public AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); 
... 
// Start listening for button presses 
am.registerMediaButtonEventReceiver(RemoteControlReceiver); 

Затмения жаловались, что mContext не решала ни к чему, поэтому я добавил следующее:

private Context mContext; 

Тогда жаловался на «mContext.getSystemService (Context.AUDIO_SERVICE)» часть, говоря «несоответствие типов: невозможно преобразовать из объекта в AudioManager»

Так что я добавил к актерскому AudioManager:

public AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 

А затем добавил предложенный регистрационный приемник код:

am.registerMediaButtonEventReceiver(MediaButtonIntentReceiver); 

, к которому она жаловалась «registerMediaButtonEventReceiver», говоря «Метод registerMediaButtonEventReceiver (ComponentName) в типе AudioManager не применяется для аргументов (BroadcastReceiver) "

Очевидно, что я здесь что-то не так. Я ввел свой пример кода, как показано, но он даже не компилируется.

--- END EDIT -----------------------------

Надеясь кто-то может помочь мне , Пожалуйста, дайте мне знать, если мне нужно что-то предложить.

+0

Поскольку трансляция 'ACTION_MEDIA_BUTTON' не является липким намерением,' registerReceiver() 'возвращает null. Вы консультировались с этой страницей? http://developer.android.com/training/managing-audio/volume-playback.html –

+0

Спасибо за ответ. Да, я прочитал эту страницу через многие другие, но я не понимаю, как BroadcastReceivers и Intents, кажется, моя самая большая проблема. – irwazr

+0

Привет, Майк, я редактировал свое оригинальное сообщение, чтобы включить вывод моих попыток следовать примерам в предложенной вами ссылке. Есть идеи? – irwazr

ответ

1

A Приемник для ACTION_MEDIA_BUTTON действий должны быть зарегистрирован registerMediaButtonEventReceiver() методом AudioManager «s, вместо обычного registerReceiver() метода в Activity. Однако, в отличие от обычной динамической регистрации приемника, этот метод принимает класс как параметр, а не экземпляр класса.Самый простой способ это создать отдельный файл класса для него:

public class MediaButtonIntentReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     ... 
    } 
} 

И мы должны были бы это приемник, указанный в манифесте, а также:

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

Теперь, к примеру, в ссылке мы ссылаемся на это неправильно, поскольку метод registerMediaButtonEventReceiver() ожидает объект ComponentName, а не только имя самого класса Receiver. Нам нужно изменить пример следующим образом:

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE); 
am.registerMediaButtonEventReceiver(
    new ComponentName(this, MediaButtonIntentReceiver.class)); 

И, как мы установили, вам не нужно mContext поля, как вы находитесь в Activity контексте, и можете просто использовать getSystemService() без квалификации. Вы также можете покончить с объектом IntentFilter, поскольку листинг в манифесте уже позаботится об этом.

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