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

Клиент удаленного управления для Android

В ICS был введен RemoteControlClient. То, как блокирующий экран, похоже, интегрируется с различными музыкальными проигрывателями. См. Скриншот ниже для примера Spotify на экране блокировки.

enter image description here

Может ли один из другого приложения, кроме экрана блокировки, интегрироваться с указанными игроками?

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

Edit:

Прогресс до сих пор: нет. Я обнаружил, что IRemoteControlDisplay, вероятно, имеет определенную роль в этом, но мои умения на базе Android/Java немного не понимают, как реализовать его и достичь той же функциональности, что и на экране блокировки.

4b9b3361

Ответ 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 и их данные.