Клиент удаленного управления для Android
В ICS был введен RemoteControlClient. То, как блокирующий экран, похоже, интегрируется с различными музыкальными проигрывателями. См. Скриншот ниже для примера Spotify на экране блокировки.
![enter image description here]()
Может ли один из другого приложения, кроме экрана блокировки, интегрироваться с указанными игроками?
Я нахожу документацию, в которой мало чего по этому поводу, но я думаю, что результаты, если это возможно, могут быть интересными.
Edit:
Прогресс до сих пор: нет. Я обнаружил, что IRemoteControlDisplay, вероятно, имеет определенную роль в этом, но мои умения на базе Android/Java немного не понимают, как реализовать его и достичь той же функциональности, что и на экране блокировки.
Ответы
Ответ 1
Во время работы над моим приложением я действительно нашел, как реализовать свой собственный RemoteControlDisplay.
В принципе, вы расширяете IRemoteControlDisplay $Stub, который отправляет сообщения специальному обработчику, этот обработчик обновляет метаданные и предмет. Затем вы регистрируете свой собственный класс, расширенный из IRemoteControlDisplay $Stub, вызывая в AudioManager # registerRemoteControlDisplay().
И затем вы отмените регистрацию, вызвав AudioManager # unregisterRemoteControlDisplay().
Это довольно сложно, но я написал статью о том, как это сделать.
Я опубликовал его на XDA, проверьте его здесь:
http://forum.xda-developers.com/showthread.php?p=44513199
Ответ 2
Я считаю, что вы можете это сделать. Однако метод будет использовать частный API (подразумевается, что он может не работать в более поздней версии ОС Android).
Я рекомендую пойти и загрузить исходный код Android (http://source.android.com/) и проверить каталог/фреймворки/base/media/java/android/media
У него есть несколько файлов, которые представляют интерес для вас:
AudioManager.java
AudioService.java
IRemoteControlClient.aidl
IRemoteControlDisplay.aidl
Менеджер аудио имеет общедоступный метод, который не документирован как registerRemoteControlDisplay. Вы должны иметь доступ к нему через отражение.
Используя этот интерфейс, вы можете зарегистрировать объект, который реализует IRemoteControlDisplay (другой недокументированный интерфейс), и вы должны иметь возможность контролировать игрока через этот объект.
Ответ 3
Попробуйте это
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
Bitmap AlbumArt=BitmapFactory.decodeResource(getResources(), R.drawable.alislahthumbmain);
mIslahReceiverComponent=new ComponentName(this,AlIslahReceiver.class.getName());
audioManager.registerMediaButtonEventReceiver(mIslahReceiverComponent);
Intent mediaButtonIntent=new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.setComponent(mIslahReceiverComponent);
PendingIntent mediaPendingIntent=PendingIntent.getBroadcast(getApplicationContext(),
0,mediaButtonIntent,0);
RemoteControlClient mRemoteControlClient=new RemoteControlClient(mediaPendingIntent);
mRemoteControlClient.editMetadata(true)
.putString(MediaMetadataRetriever.METADATA_KEY_TITLE,AlIslahApplication.getStreamTitle())
.putBitmap(100,AlbumArt)
.apply();
mRemoteControlClient.setPlaybackState(
RemoteControlClient.PLAYSTATE_PLAYING);
mRemoteControlClient.setTransportControlFlags(
RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE|
RemoteControlClient.FLAG_KEY_MEDIA_STOP);
audioManager.registerRemoteControlClient(mRemoteControlClient);
Ответ 4
Вы не можете получить одни и те же запросы, чтобы отображать экран, который делает экран блокировки, но вы, безусловно, можете инициировать те же события, что и кнопки на этом экране с вещательными намерениями.
Это действие - ACTION_MEDIA_BUTTON, и вы должны приложить KeyEvent с соответствующим keyCode, чтобы делать то, что вы хотите.
Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
intent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(
KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE));
sendBroadcast(intent);
Это сделает то же самое, что нажатие кнопки воспроизведения/паузы на заблокированном экране. Вы можете сделать это с помощью других ключевых кодов KeyEvent, которые имеют смысл (KEYCODE_MEDIA_NEXT и т.д.), Хотя вы не знаете, что воспроизводимая в данный момент трек зарегистрировала себя как поддерживающую, в то время как lockscreen делает.
Ответ 5
Для тех, кто наткнулся на этот выпуск post KitKat, вы можете теперь использовать RemoteController
, который соединяется с RemoteControlClients и позволяет вам управлять их.
Ответ 6
Вам нужно будет реализовать интерфейс IRemoteControl *.aidl в вашем приложении, и приложения (например, Spotify) должны зарегистрироваться в вашем приложении, чего еще нет.
Они регистрируются в AudioManager. Таким образом, вы не сможете поймать регистрацию RemoteClient без изменения приложений (Spotify и т.д.) Или изменения системы Android, чтобы ваше приложение могло захватывать RemoteClients и их данные.