android - samsung - spotify en pantalla de bloqueo iphone
Establecer fondo de pantalla de bloqueo en Android(como Spotify hacer) (5)
Sé que este tema ya se ha discutido here , here y here , 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 fondo de la pantalla de bloqueo cambia con la portada del álbum que estoy escuchando (ver capturas de pantalla).
Mi teoría era: cuando el teléfono está bloqueado, cambian el fondo de pantalla del teléfono con la portada del álbum para cambiar también el fondo de la pantalla de bloqueo, y luego restablecen el anterior cuando el teléfono está desbloqueado. Pero no es así como lo hacen, porque en la lista de permisos de Spotify no hay "android.permission.SET_WALLPAPER" ... :(
¿Cómo lo hicieron? ¿Alguna teoría?
Así que aquí está la nueva "documentación oficial".
En la parte inferior describe los detalles de la pantalla de bloqueo.
Como alternativa, una vez que entendí todos los términos y la jerga, este tutorial me ayudó a describir la estructura general de los servicios de MediaSessionCompat.
https://code.tutsplus.com/tutorials/background-audio-in-android-with-mediasessioncompat--cms-27030
Finalmente, hay una API para el fondo de pantalla de bloqueo en Nougat y superior. Por qué esto no es soporte lib está más allá de mí en este momento.
Bueno, después de intentar algunas formas, tengo un código simple aquí; Trate de usar este método;
private void updateMetaData() {
mediaSession =new MediaSessionCompat(context,"BXPlayer");
Bitmap cover = BitmapFactory.decodeResource(context.getResources(),
R.drawable.cover2);
mediaSession.setMetadata(new MediaMetadataCompat.Builder()
.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, cover)
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, mSelectedSong.getArtist())
.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, mSelectedSong.getAlbum())
.putString(MediaMetadataCompat.METADATA_KEY_TITLE, mSelectedSong.getTitle())
.build());
}
luego, en su notificación, debe configurar el estilo en android.support.v4.media.app.NotificationCompat.MediaStyle()
y configurar el token de sesión de medios para que use los metadatos actuales. Compruebe este fragmento a continuación;
builder.setStyle(new android.support.v4.media.app.NotificationCompat.MediaStyle()
.setShowActionsInCompactView(0, 1, 2)
.setMediaSession(mediaSession.getSessionToken()));
return builder.build();
¡Y bum! tú eres bueno para irte.
Como se explica here la clave es pasar un objeto MediaMetadata a su MediaSession. Si estos términos te parecen ajenos, lo mejor es comenzar el tutorial vinculado desde la parte superior.
Encontré que la línea .putBitmap(MediaMetadata.METADATA_KEY_ART, bitmap)
es la que se toma para cargar la imagen en el fondo de la pantalla de bloqueo. Pero asegúrese de llenar .putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, bitmap)
también.
Para mí, el ejemplo más instructivo fue Random Music Player , mencionado en la documentación sobre las API de Android 4.0 :
"Para ver una implementación de muestra, consulte el Reproductor de música aleatorio, que proporciona una lógica de compatibilidad tal que habilita al cliente de control remoto en dispositivos Android 4.0 mientras continúa brindando soporte a los dispositivos para Android 2.1".
Además, convertí el texto en mapa de bits para tener texto como carátula del álbum.
Edición: la solución a continuación solo funciona para las aplicaciones que se han registrado como controlador de medios, por lo que las aplicaciones que no reproducen audio no pueden / no deben usar este mecanismo para cambiar el fondo de pantalla de bloqueo.
Se puede hacer usando RemoteControlClient , parte de Android desde ICS. Si desea un ejemplo funcional, descargue VLC para Android y revise org.videolan.vlc.AudioService
:
Esta parte del código es para 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();
}
}