Establecer el fondo de la pantalla de bloqueo en Android (como Spotify)

Sé que este tema ya se ha discutido aquí , aquí y aquí , y la respuesta parece ser que no es posible.

Pero recientemente instalé Spotify en mi Nexus 4 (4.4.2), y parece ser posible. Cuando escucho una canción en Spotify el cambio de fondo de pantalla de bloqueo con la portada del álbum que estoy escuchando (ver capturas de pantalla).

Mi teoría era: cuando el teléfono está bloqueado cambiar el fondo de pantalla del teléfono con la portada del álbum con el fin de cambiar también el fondo de la pantalla de bloqueo, a continuación, establecer la anterior cuando el teléfono está desbloqueado. Pero esto no es cómo lo hacen, porque en la lista de permisos de Spotify no hay "android.permission.SET_WALLPAPER" … 🙁

¿Cómo lo hicieron? ¿Alguna teoría?

Pantalla de bloqueo de pantallaPantalla de bloqueo de pantalla

Editar: La solución siguiente sólo funciona para aplicaciones que se han registrado como controlador de medios, por lo que las aplicaciones que no reproducen audio no pueden / no deberían utilizar este mecanismo para cambiar el papel tapiz de lockscreen.


Se puede hacer usando RemoteControlClient , parte de Android desde ICS. Si desea un ejemplo org.videolan.vlc.AudioService , descargue VLC para Android y consulte org.videolan.vlc.AudioService :

Esta parte del código es interceptar controles de medios.

 /** * 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); } } 

Esta parte es para actualizar obras de arte, entre otra información:

 @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(); } } 

Para mí, el ejemplo más instructivo fue Random Music Player , mencionado en la documentación sobre las API de Android 4.0 :

"Para una implementación de ejemplo, vea el reproductor de música aleatorio, que proporciona una lógica de compatibilidad que permite que el cliente de control remoto en Android 4.0 dispositivos, mientras continúa con los dispositivos de apoyo a Android 2.1.

Además, convertí texto en mapa de bits para tener texto como álbum.

Así que aquí está el nuevo "documentos oficiales"

En la parte inferior se describen los detalles de la pantalla de bloqueo

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

Como alternativa, una vez que entendí todos los términos y jerga, este tutorial me ayudó a delinear la estructura general de los servicios MediaSessionCompat.

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

Por último, hay una API para el papel tapiz de pantalla de bloqueo en Nougat y mayor. ¿Por qué esto no es la ayuda lib es más allá de mí en este momento.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.