Управление музыкальным проигрывателем по умолчанию для Android или любого другого музыкального проигрывателя
Как управлять музыкальным проигрывателем по умолчанию для Android или любого другого плеера? Под контролем я имею в виду паузу, воспроизведение, следующий и т. Д. Нужно ли связывать сервис? Я пытался использовать IMediaPlaybackService
Но это не работает. Конечно, есть выход, так как я видел приложения на рынке Android, которые управляют музыкальным проигрывателем. Любая идея?
5 ответов
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";
Проблема с отправкой Intent
для широковещательного приемника пользователь должен открыть Music Player хотя бы один раз, кроме того, он не работает для многих сторонних музыкальных проигрывателей.
Приведенный ниже код работает на всех музыкальных проигрывателях.
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.
Этот код имитирует действие кнопки воспроизведения / паузы от устройства громкой связи (наушники).
Если вы хотите управлять музыкальным проигрывателем (текущим воспроизводящим), есть способ отправить 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 или больше.
Похоже, упомянутые методы 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);
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)
Решение для всех последних и более старых версий (ниже kitkat для Android 10).
/*global variable for audiomanager*/
AudioManager mAudioManager;
/*initalize audiomanager in oncreate or onCreateView if using fragment*/
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
/*trigger keyEvent to play system music */
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mAudioManager.dispatchMediaKeyEvent(event);
}
else
{
Intent i = new Intent(SERVICECMD);
i.putExtra(CMDNAME , CMDPLAY );
sendBroadcast(i);
}
/*you can use same code for stop system music but you need to change MEDIA_PLAY to MEDIA_STOP*/
В 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
было слишком сложно.
Если вы хотите возобновить музыку снова, удалите цикл if из ответа @Ahmad Ekri
Но очень полезный ответ действительно!