2016-03-22 5 views
1

Мой проект почти закончен, оставил только один важный элемент. Это то, что я прошу прямо сейчас.Как перехватить нажатие кнопки гарнитуры в Android L?

Может ли кто-нибудь сказать мне, как прослушивать нажатие на гарнитуру/медиа-кнопки в Android L & выше? Я собираюсь попытаться использовать AM.registerReceiver, когда я понимаю, что он устарел, и я не вижу много документации/примеров в том, как использовать MediaSession (я пытаюсь использовать совместимость с моего minSDK - это API 16, есть ли любая разница?). Вот то, что я сейчас делаю (что приводит ни к чему):

void initReceivers() throws IllegalArgumentException { 
     final int RC = 1001; 

     if (!MainActivity.noisyRegistered) { 
      app.registerReceiver(noisyReceiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); 
      MainActivity.noisyRegistered = true; 

      Intent intent = new Intent(app, AudioReceiver.class); 
      PendingIntent pending = PendingIntent.getBroadcast(app, RC, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
      ComponentName name = new ComponentName(app.getPackageName(), AudioReceiver.class.getName()); 
      MediaSessionCompat mediaSession = new MediaSessionCompat(app, "sggTag", name, pending); 
      mediaSession.setMediaButtonReceiver(pending); 
     } 
    } 

static public class AudioReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (!intent.getAction().equals(Intent.ACTION_MEDIA_BUTTON)) 
      return; 
     KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     if (event == null || binder == null || player == null) 
      return; 

     switch (event.getKeyCode()) { 
      case KeyEvent.KEYCODE_MEDIA_PLAY: 
       binder.resume(); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_PAUSE: 
       binder.resume(); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 
       if (player.isPlaying()) 
        binder.pause(); 
       else 
        binder.resume(); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_NEXT: 
       binder.next(); 
       break; 
      case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 
       binder.prev(); 
       break; 
     } 
    } 
} 

Мой манифест:

<receiver android:name=".ListenService$AudioReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON"/> 
     </intent-filter> 
    </receiver> 

Я на самом деле очень смущен, почему мне нужно предоставить для отложенного намерения, когда есть setCallback метод.

спасибо.

ответ

-1

Недавно я разработал приложение, которое отреагировало на кнопку мультимедиа. Я тестировал его в Samsung Galaxy S II, и он работал.

Во-первых, в вашем AndroidManifest.xml, внутри области, поместите следующее:

<receiver  android:name="net.work.box.controller.receivers.RemoteControlReceiver" > 
<intent-filter android:priority="1000000000000000" > 
    <action android:name="android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 

Затем создайте BroadcastReceiver в другом файле:

общественного класса RemoteControlReceiver расширяет BroadcastReceiver {

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

     if (event == null) { 
      return; 
     } 

     if (event.getAction() == KeyEvent.ACTION_DOWN) { 
      context.sendBroadcast(new Intent(Intents.ACTION_PLAYER_PAUSE)); 
     } 
    } 
} 

}

Это, вероятно, не лучшее решение (особенно жесткий код Android: приоритет выше). Тем не менее, он пробовал несколько других методов, и никто из них, похоже, не работал. Поэтому я должен прибегнуть к этому ... Надеюсь, я помог.

+0

http://android-developers.blogspot.in/2010/06/allowing-applications-to-play-nicer.html Используйте следующую ссылку также –

+0

Не может решить символ на 1000000000000000 в моем манифесте. –

+1

Android Studio не может найти эту часть: Intents.ACTION_PLAYER_PAUSE –

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