Как управлять музыкальным плеером по умолчанию для Android или любого другого игрока? Управляя, я имею в виду паузу, игру, следующий и т.д. Нужно ли мне связывать услугу? Я попытался использовать IMediaPlaybackService
, но он не работает. Конечно, есть выход, так как я видел приложения на рынке Android, которые контролируют музыкальный плеер. Любая идея?
Управление музыкальным плеером по умолчанию для Android или любого другого музыкального плеера
Ответ 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)