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

Управление музыкальным плеером по умолчанию для Android или любого другого музыкального плеера

Как управлять музыкальным плеером по умолчанию для Android или любого другого игрока? Управляя, я имею в виду паузу, игру, следующий и т.д. Нужно ли мне связывать услугу? Я попытался использовать IMediaPlaybackService, но он не работает. Конечно, есть выход, так как я видел приложения на рынке Android, которые контролируют музыкальный плеер. Любая идея?

4b9b3361

Ответ 1

AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

if(mAudioManager.isMusicActive()) {
    Intent i = new Intent(SERVICECMD);
    i.putExtra(CMDNAME , CMDSTOP );
    YourApplicationClass.this.sendBroadcast(i);
}

вы можете получить аудиомастер, а затем отправить ему команды.

это команды.

 public static final String CMDTOGGLEPAUSE = "togglepause";
 public static final String CMDPAUSE = "pause";
 public static final String CMDPREVIOUS = "previous";
 public static final String CMDNEXT = "next";
 public static final String SERVICECMD = "com.android.music.musicservicecommand";
 public static final String CMDNAME = "command";
 public static final String CMDSTOP = "stop";

Ответ 2

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

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

long eventtime = SystemClock.uptimeMillis();

Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
sendOrderedBroadcast(downIntent, null);

Intent upIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
upIntent.putExtra(Intent.EXTRA_KEY_EVENT, upEvent);
sendOrderedBroadcast(upIntent, null);

/*NEXT*/
Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN,   KeyEvent.KEYCODE_MEDIA_NEXT, 0);
downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
sendOrderedBroadcast(downIntent, null);

/*PREVIOUS*/
Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS, 0);
downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
sendOrderedBroadcast(downIntent, null);

Я тестировал этот код на устройствах Sony, Htc и Samsung.

Этот код имитирует действие кнопки воспроизведения/паузы из громкой связи (наушники).

Ответ 3

Если вы хотите управлять музыкальным проигрывателем (текущим воспроизведением), есть способ отправить к нему KeyEvents:

if (mAudioManager == null) mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);

KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY);
mAudioManager.dispatchMediaKeyEvent(event);

Это более безопасный способ, потому что, как правило, трансляция keyEvent может привести к одновременному воспроизведению нескольких игроков.

Примечание: он должен иметь minSdk 19 или более.

Ответ 4

Похоже, что упомянутые методы KeyEvent не работают для меня в последнем SDK. Использование метода dispatchMediaKeyEvent() AudioManager с определенным KeyEvent работал у меня.

Смотрите: здесь

Пример кода:

this.mAudioManager = (AudioManager) this.context.getSystemService(Context.AUDIO_SERVICE);

long eventtime = SystemClock.uptimeMillis();

KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
mAudioManager.dispatchMediaKeyEvent(downEvent);

KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT, 0);
mAudioManager.dispatchMediaKeyEvent(upEvent);

Ответ 5

В Android 4.4 появился новый метод RemoteController, но это боль в заднице, и я не мог заставить его работать. Он также требует, чтобы вы направляли пользователя в глобальные параметры безопасности и позволяли вам получать доступ к всем своим уведомлениям!!! Я не уверен, что Google думает здесь.

В любом случае я выполнил все инструкции, но registerRemoteController() по-прежнему возвращает false, так что я еще ничего не могу сделать (очевидно, Google никогда не слышал о кодах ошибок).

Учитывая, что метод user2572182, похоже, не работает на Android 4.4, кажется, это невозможно.

Изменить: Я нашел пример приложения с помощью RemoteController на XDA всех мест (кто знал, что там есть полезный контент?). Он работает на моем телефоне, но вам все равно нужно сказать своим пользователям, чтобы они пошли и изменили некоторые неясные настройки безопасности, поэтому он не идеален:

http://forum.xda-developers.com/showthread.php?p=51535568

Изменить 2: Google изменил это снова на Android "L" . Я предполагаю, что они поняли, что RemoteControlClient было слишком сложно.

Ответ 6

Если вы хотите возобновить воспроизведение музыки, удалите if-loop из ответа @Ahmad Ekri

Но очень полезный ответ действительно!

Ответ 7

KeyEvent не работает должным образом в новейших Android, а также не поддерживает такие приложения, как Spotify. Лучшее решение - использовать MediaController. Для каждого приложения, которое воспроизводится в данный момент, и вы хотите управлять им, вы должны создать другой MediaController. Это требует Context и MediaSession.Token. Токен "идентифицирует" процесс воспроизведения музыки. Например, если вы играли в Google Play Music и теперь играете в Spotify, вы можете создавать MediaController для обоих. Как получить токены? Есть два способа:

  • Получить список из MediaSessionManager. Вы можете найти его в примере проекта Google
  • Получить его из уведомлений - если у вас есть доступ к уведомлениям (NotificationListenerService), вы можете искать уведомления из музыкальных приложений и получать их текущий токен.

Вы проверяете текущее состояние сеанса из MediaController:

getPlaybackState().getState() //e.g. PlaybackStateCompat.STATE_PLAYING

и управляйте приложением, используя средства управления транспортом, например:

getTransportControls().skipToNext()

В зависимости от вашего minSDK используйте Compat или не версию. Вы можете привести MediaSession.Token к MediaSessionCompat.Token с помощью:

MediaSessionCompat.Token.fromToken(token)