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

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

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

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

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

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

Screenshot lock screenScreenshot lock screen

4b9b3361

Ответ 1

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


Это можно сделать, используя 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();
    }
}

Ответ 2

Для меня самым поучительным примером был Случайный музыкальный проигрыватель, упомянутый в о API 4.0 для Android 4.0:

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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