Установите фон блокировки экрана в Android (например, Spotify do)

Я знаю, что эта тема уже обсуждалась здесь , здесь и здесь , и ответ кажется, что это невозможно.

Но я недавно установил Spotify в своем Nexus 4 (4.4.2), и это кажется возможным. Когда я прослушиваю песню в Spotify, фон фона блокировки меняется с обложкой альбома, который я слушаю (см. Скриншоты).

Моя теория заключалась в том, что когда телефон заблокирован, они меняют обои телефона с обложкой альбома, чтобы изменить фон фона блокировки, после чего он отменил предыдущий, когда телефон разблокирован. Но это не так, как они это делают, потому что в списке разрешений Spotify нет «android.permission.SET_WALLPAPER» … 🙁

Как они это делают? Некоторая теория?

Экран блокировки экранаЭкран блокировки экрана

Изменить . Решение ниже работает только для приложений, которые зарекомендовали себя как медиа-controller, поэтому приложения, которые не воспроизводят аудио, не могут / не должны использовать этот механизм для изменения обоев экрана.


Это можно сделать с помощью RemoteControlClient , входящего в состав Android с ICS. Если вам нужен рабочий пример, загрузите VLC для Android и посмотрите org.videolan.vlc.AudioService :

Эта часть кода предназначена для перехвата средств управления мультимедиа.

 /** * Set up the remote control and tell the system we want to be the default receiver for the MEDIA buttons * @see http://android-developers.blogspot.fr/2010/06/allowing-applications-to-play-nicer.html */ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public void setUpRemoteControlClient() { Context context = VLCApplication.getAppContext(); AudioManager audioManager = (AudioManager)context.getSystemService(AUDIO_SERVICE); if(Util.isICSOrLater()) { audioManager.registerMediaButtonEventReceiver(mRemoteControlClientReceiverComponent); if (mRemoteControlClient == null) { Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.setComponent(mRemoteControlClientReceiverComponent); PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(context, 0, mediaButtonIntent, 0); // create and register the remote control client mRemoteControlClient = new RemoteControlClient(mediaPendingIntent); audioManager.registerRemoteControlClient(mRemoteControlClient); } mRemoteControlClient.setTransportControlFlags( RemoteControlClient.FLAG_KEY_MEDIA_PLAY | RemoteControlClient.FLAG_KEY_MEDIA_PAUSE | RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS | RemoteControlClient.FLAG_KEY_MEDIA_NEXT | RemoteControlClient.FLAG_KEY_MEDIA_STOP); } else if (Util.isFroyoOrLater()) { audioManager.registerMediaButtonEventReceiver(mRemoteControlClientReceiverComponent); } } 

Эта часть предназначена для обновления художественных работ, среди прочих сведений:

 @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) private void updateRemoteControlClientMetadata() { if(!Util.isICSOrLater()) // NOP check return; if (mRemoteControlClient != null) { MetadataEditor editor = mRemoteControlClient.editMetadata(true); editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, getCurrentMedia().getAlbum()); editor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, getCurrentMedia().getArtist()); editor.putString(MediaMetadataRetriever.METADATA_KEY_GENRE, getCurrentMedia().getGenre()); editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, getCurrentMedia().getTitle()); editor.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, getCurrentMedia().getLength()); editor.putBitmap(MetadataEditor.BITMAP_KEY_ARTWORK, getCover()); editor.apply(); } } 

Для меня самым поучительным примером был Random Music Player , упомянутый в документации об Android 4.0 API :

«Для примера реализации см. Random Music Player, который обеспечивает логику совместимости, позволяющую клиенту удаленного управления на устройствах Android 4.0 продолжать поддерживать устройства обратно на Android 2.1».

Кроме того, я преобразовал текст в bitmap, чтобы текст стал обложкой альбома.

Итак, вот новые «официальные документы»,

Внизу описываются подробности блокировки экрана

https://developer.android.com/guide/topics/media-apps/working-with-a-media-session.html#maintain-state

В качестве альтернативы, когда я понял все термины и жаргон, этот учебник помог мне описать общую структуру служб MediaSessionCompat.

https://code.tutsplus.com/tutorials/background-audio-in-android-with-mediasessioncompat–cms-27030

Наконец, есть API для затвора экрана обои в Нугате и больше. Почему это не поддержка lib находится вне меня в это время.

как объяснено здесь, ключом является передать объект MediaMetadata на ваш MediaSession. Если эти термины кажутся вам чуждыми, лучше начать связанный учебник сверху.

Я нашел .putBitmap(MediaMetadata.METADATA_KEY_ART, bitmap) которая будет загружена, чтобы загрузить изображение на фон блокировки экрана. Но обязательно .putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, bitmap) .

  • getExtra от Intent, запущенного из ожидающего
  • Как получить документы в каталоге Android, которые PhoneGap увидит
  • как получить префикс страны страны от iso
  • Как заставить Bitmap сжимать без изменения размер растрового изображения?
  • Входящие и исходящие вызовы Android
  • Программно получить уровень API Android на устройстве?
  • Динамическое создание кнопок и установка onClickListener
  • Как работает Android Support Library?
  • Заставить камеру всегда открывать в портретном режиме в android
  • Как узнать, что мое приложение для Android было обновлено для сброса тревоги?
  • Как получить URL из хранилища Firebase getDownloadURL
  • Давайте будем гением компьютера.