2016-09-26 5 views
1

Вот мое усилие сделать рабочий код для обработки события кнопки гарнитуры лучшим способом. Я читал Android developer guide, но это явно неправильно, потому что они просят начать прослушивание регистрации имени класса.Android: Управление событиями кнопок гарнитуры и отправка информации в MainActivity

am.registerMediaButtonEventReceiver(RemoteControlReceiver); // Wrong 

Поэтому я проверяю другие примеры, чтобы исправить код. Например, многие секретные предложения были опубликованы в this question, я также попробовал другой код, такой как this, и другое решение с MediaSession и очистки ненужных Я написал этот код:

я реализовал класс RemoteControlReceiver. Видимо, нет необходимости для статического внутреннего класса, на самом деле, см this comment:

public class RemoteControlReceiver extends BroadcastReceiver { 

     public RemoteControlReceiver() { 
      super(); 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show(); 
      if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
       KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
       if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) { 
        Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show(); 

       } 
      } 
     } 
    } 

Тогда я зарегистрировал намерение внутри MainActivity OnCreate() { ...

AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); 
    ComponentName mReceiverComponent = new ComponentName(this, RemoteControlReceiver.class); 
    am.registerMediaButtonEventReceiver(mReceiverComponent); 

registerMediaButtonEventReceiver устарел, кстати, ...

Внутри манифеста я записываю фильтр, после тега активности:

<activity> 
... 
</activity> 

<receiver android:name=".RemoteControlReceiver" android:enabled="true"> 
    <intent-filter android:priority="2147483647"> 
     <action android:name="android.intent.action.MEDIA_BUTTON" /> 
    </intent-filter> 
</receiver> 

Примечание: со статическим внутренним классом будет, например, «.MainActivity $ RemoteControlReceiver».

Я работаю на

compileSdkVersion 24 
buildToolsVersion "24.0.0" 
... 
minSdkVersion 21 
targetSdkVersion 24 

Вот мои вопросы:

  • Почему registerMediaButtonEventReceiver устарела? Кажется, что вся эта парадигма сейчас не так, но я не нашел информации о том, как справиться с этим классом проблем на портале разработчиков Android.
  • В каком режиме я могу взаимодействовать с MainActivity? Моя цель - выполнить действие в MainActivity, когда была выполнена какая-либо операция с гарнитурой.
+0

Ваш манифест говорит 'MainActivity $ MediaButtonReceiver', но ваш класс называется' RemoteControlReceiver'. Что он? – ianhanniballake

+0

Благодарим вас @ianhanniballake за то, что вам нужно. Это была только типовая копия, но я реализовал множество приемников во время всех экспериментов. Теперь я исправил его, я подтвердил, что настройка такая же, как описано. – donnadulcinea

ответ

1

API 21 изменил все API-интерфейсы приложений мультимедиа, теперь полностью сосредоточен вокруг MediaSession. Вместо регистрации BroadcastReceiver (как было необходимо до API 18) или PendingIntent (через registerMediaButtonEventReceiver(PendingIntent)) вы можете получать обратные вызовы непосредственно в MediaSession.Callback.

Вы можете настроить MediaSession с помощью следующего кода:

MediaSession.Callback callback = new MediaSession.Callback() { 
    @Override 
    public void onPlay() { 
    // Handle the play button 
    } 
}; 
MediaSession mediaSession = new MediaSession(context, 
    TAG); // Debugging tag, any string 
mediaSession.setFlags(
    MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | 
    MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS); 
mediaSession.setCallback(callback); 

// Set up what actions you support and the state of your player 
mediaSession.setState(
    new PlaybackState.Builder() 
    .setActions(PlaybackState.ACTION_PLAY | 
       PlaybackState.ACTION_PAUSE | 
       PlaybackState.ACTION_PLAY_PAUSE); 
    .setState(PlaybackState.STATE_PLAYING, 
     0, // playback position in milliseconds 
     1.0); // playback speed 

// Call this when you start playback after receiving audio focus 
mediaSession.setActive(true); 

Если вы хотите обрабатывать мультимедийные кнопки в то время как ваша деятельность видна, вы можете просто ваш MediaSession обрабатываются самой деятельности (это было позвольте вашему Callback просто быть переменной в вашей деятельности).

Best practices in media playback talk from I/O 2016 проходит через все детали и другой API-интерфейсы, необходимые для создания большого приложения средств массовой информации, хотя отмечает, что она использует MediaSessionCompat и другие классы библиотеки поддержки, как подробно описано в Media playback and the Support Library blog post.

+0

Вот и все @ianhanniballake, я хотел найти информацию о новых лучших практиках. Все прилагаемые ссылки также будут полезны. Спасибо! – donnadulcinea