5

J'essaie d'obtenir l'écran de verrouillage dans le mobile Je suis capable de faire tout fonctionner comme la notification et d'autres choses de mon application, mais quand j'essaie d'afficher l'écran de verrouillage, il n'est pas travailler du tout pour android M.Comment faire une notification d'écran de verrouillage pour lecteur multimédia

private void initMediaSession() throws RemoteException { 
    if (mediaSessionManager != null) return; //mediaSessionManager exists 
    ComponentName mediaButtonReceiver = new ComponentName(getApplicationContext(), MediaButtonReceiver.class); 

    mediaSession = new MediaSessionCompat(getApplicationContext(), "AudioPlayer", mediaButtonReceiver, null); 
    //Get MediaSessions transport controls 
    transportControls = mediaSession.getController().getTransportControls(); 
    //set MediaSession -> ready to receive media commands 
    mediaSession.setActive(true); 
    //indicate that the MediaSession handles transport control commands 
    // through its MediaSessionCompat.Callback. 
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 
    Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    mediaButtonIntent.setClass(this, MediaButtonReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, 0); 
    mediaSession.setMediaButtonReceiver(pendingIntent); 
    //Set mediaSession's MetaData 
    updateMetaData(); 
    // passing the data 


    // Attach Callback to receive MediaSession updates 
    mediaSession.setCallback(new MediaSessionCompat.Callback() { 
     // Implement callbacks 
     @Override 
     public void onPlay() { 
      super.onPlay(); 
      messagesent(); 
      a = false; 
      resumeMedia(); 
      buildNotification(PlaybackStatus.PLAYING); 
     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      messagesent(); 
      a = true; 
      pauseMedia(); 
      buildNotification(PlaybackStatus.PAUSED); 
     } 

     @Override 
     public void onSkipToNext() { 
      super.onSkipToNext(); 

      skipToNext(); 
      updateMetaData(); 
      buildNotification(PlaybackStatus.PLAYING); 
     } 

     @Override 
     public void onSkipToPrevious() { 
      super.onSkipToPrevious(); 

      skipToPrevious(); 
      updateMetaData(); 
      buildNotification(PlaybackStatus.PLAYING); 
     } 

     @Override 
     public void onStop() { 
      super.onStop(); 
      removeNotification(); 
      //Stop the service 
      pauseMedia(); 
      messagesent(); 
      stopSelf(); 
     } 

     @Override 
     public void onSeekTo(long position) { 
      super.onSeekTo(position); 
     } 
    }); 
} 

private void updateMetaData() { 
    //replace with medias albumArt 
    // Update the current metadata 
    MediaMetadataCompat.Builder metadataBuilder = new MediaMetadataCompat.Builder(); 

    String artist; 
    if (activeAudio.getArtist() != null) { 
     artist = activeAudio.getArtist(); 
    } else { 
     artist = "unknown"; 
    } 
    String album; 
    if (activeAudio.getAlbum() != null) { 
     album = activeAudio.getAlbum(); 
    } else { 
     album = "Album"; 
    } 
    Bitmap albumArt; 
    Uri myUri = Uri.parse(activeAudio.getAlbum_art()); 
    try { 
     InputStream image_stream = getContentResolver().openInputStream(myUri); 
     Bitmap bitmap = BitmapFactory.decodeStream(image_stream); 
     if (bitmap != null) { 
      albumArt = bitmap; 
     } else { 
      albumArt = BitmapFactory.decodeResource(getResources(), 
        R.drawable.music); 
     } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     albumArt = BitmapFactory.decodeResource(getResources(), 
       R.drawable.music); 
    } 
    metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, albumArt); 
    metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt); 

    //lock screen icon for pre lollipop 
    metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, albumArt); 
    metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, activeAudio.getTitle()); 
    metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, activeAudio.getAlbum()); 
    metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album); 
    metadataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, 1); 
    metadataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, 1); 

    mediaSession.setMetadata(metadataBuilder.build()); 
} 

private void buildNotification(PlaybackStatus playbackStatus) { 

    /** 
    * Notification actions -> playbackAction() 
    * 0 -> Play 
    * 1 -> Pause 
    * 2 -> Next track 
    * 3 -> Previous track 
    */ 

    MediaControllerCompat controller = mediaSession.getController(); 
    MediaMetadataCompat mediaMetadata = controller.getMetadata(); 
    MediaDescriptionCompat description = mediaMetadata.getDescription(); 

    RemoteViews views = new RemoteViews(getPackageName(), 
      R.layout.customnotification); 


    if (playbackStatus == PlaybackStatus.PLAYING || Singleton.getInstance().getMedia() == 1) { 
     views.setImageViewResource(R.id.imageButton2, 
       R.drawable.ic_pause_circle_outline_white_48dp); 

     messagesent(); 

     views.setOnClickPendingIntent(R.id.imageButton2, playbackAction(1)); 

    } else if (playbackStatus == PlaybackStatus.PAUSED || Singleton.getInstance().getMedia() == 2) { 
     views.setImageViewResource(R.id.imageButton2, 
       R.drawable.ic_play_circle_outline_white_48dp); 
     messagesent(); 

     views.setOnClickPendingIntent(R.id.imageButton2, playbackAction(0)); 

    } 

    views.setViewVisibility(R.id.imageView, View.VISIBLE); 

    // Intent notificationIntent = new Intent(this, Main2Activity.class); 

    // PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
    //   notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 


    views.setOnClickPendingIntent(R.id.imageButton3, playbackAction(3)); 
    views.setOnClickPendingIntent(R.id.imageButton4, playbackAction(2)); 

    views.setImageViewResource(R.id.imageButton3, 
      R.drawable.ic_skip_previous_circle_outline_white_36dp); 
    views.setImageViewResource(R.id.imageButton4, 
      R.drawable.ic_skip_next_circle_outline_white_36dp); 
    views.setTextViewText(R.id.textView, description.getTitle()); 
    views.setTextViewText(R.id.textView2, description.getSubtitle()); 
    views.setImageViewBitmap(R.id.imageView, description.getIconBitmap()); 


    NotificationCompat.Builder sta = new NotificationCompat.Builder(this); 
    // sta.setContentIntent(pendingIntent); 
    sta.setContent(views); 
    sta.setSmallIcon(R.drawable.ic_audiotrack_white_24dp); 
    sta.setStyle(new NotificationCompat.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mediaSession.getSessionToken())); 


    startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE, sta.build()); 



} 


public PendingIntent playbackAction(int actionNumber) { 
    Intent playbackAction = new Intent(this, MediaService.class); 
    switch (actionNumber) { 
     case 0: 
      // Play 
      playbackAction.setAction(ACTION_PLAY); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     case 1: 
      // Pause 
      playbackAction.setAction(ACTION_PAUSE); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     case 2: 
      // Next track 
      playbackAction.setAction(ACTION_NEXT); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     case 3: 
      // Previous track 
      playbackAction.setAction(ACTION_PREVIOUS); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     case 4: 
      playbackAction.setAction(Constants.ACTION.STOPFOREGROUND_ACTION); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     default: 
      break; 
    } 
    return null; 
} 

J'ai essayé de définir la notification .setstyle mais il montre une erreur. J'ai suivi la vidéo de ian lake mais cela ne fonctionne toujours pas quelqu'un peut-il aider ce que je fais mal

+0

L'arrière-plan de l'écran de verrouillage affiche-t-il les pochettes d'album? Votre problème est que 'Notification' ne s'affiche pas correctement? –

+0

J'ai fait la notification personnalisée et rien ne s'affiche en arrière-plan – SAVVY

+0

Si l'arrière-plan ne change pas, vous avez probablement manqué quelque chose dans le code 'MediaController'. Avez-vous suivi les étapes mentionnées ici https://stackoverflow.com/a/32656418/1904141? –

Répondre

1

Vérifiez d'abord si votre application fonctionne en utilisant targetSdkVersion 22 sur build.gradle. Si cela fonctionne, vous avez un problème lié à l'exécution de Marshmallow. Ajoutez les autorisations requises sur Manifest et exécutez votre initMediaSession() si les autorisations sont accordées. Détails Link1 et Link2.

Si cela ne vous aide pas alors fournissez vos détails d'erreur.

+0

bro fonctionne correctement pour certains périphériques, mais il ne s'affiche pas pour le périphérique lolipop. correctement – SAVVY

+0

L'application ne tombe pas en panne mais elle ne montre aucun écran de verrouillage. – SAVVY

1

J'ai suivi le suivre le tutoriel suivant et obtenir la sortie.

private Notification createNotification() { 
if (mMetadata == null || mPlaybackState == null) { 
    return null; 
} 

Notification.Builder notificationBuilder = new Notification.Builder(mService); 
int playPauseButtonPosition = 0; 

// If skip to previous action is enabled 
if ((mPlaybackState.getActions() & PlaybackState.ACTION_SKIP_TO_PREVIOUS) != 0) { 
    notificationBuilder.addAction(R.drawable.ic_prev_gray, 
      mService.getString(R.string.label_previous), mPreviousIntent); 

    // If there is a "skip to previous" button, the play/pause button will 
    // be the second one. We need to keep track of it, because the MediaStyle notification 
    // requires to specify the index of the buttons (actions) that should be visible 
    // when in compact view. 
    playPauseButtonPosition = 1; 
} 

addPlayPauseAction(notificationBuilder); 

// If skip to next action is enabled 
if ((mPlaybackState.getActions() & PlaybackState.ACTION_SKIP_TO_NEXT) != 0) { 
    notificationBuilder.addAction(R.drawable.ic_next_gray, 
      mService.getString(R.string.label_next), mNextIntent); 
} 

MediaDescription description = mMetadata.getDescription(); 

String fetchArtUrl = null; 
Bitmap art = null; 
if (description.getIconUri() != null) { 
    // This sample assumes the iconUri will be a valid URL formatted String, but 
    // it can actually be any valid Android Uri formatted String. 
    // async fetch the album art icon 
    String artUrl = description.getIconUri().toString(); 
    if (art == null) { 
     fetchArtUrl = artUrl; 
     // use a placeholder art while the remote art is being downloaded 
     art = BitmapFactory.decodeResource(mService.getResources(), R.mipmap.ic_launcher); 
    } 
} 

notificationBuilder 
     .setStyle(new Notification.MediaStyle() 
      .setShowActionsInCompactView(new int[]{playPauseButtonPosition}) // show only play/pause in compact view 
      .setMediaSession(mSessionToken)) 
     .setColor(mNotificationColor) 
     .setSmallIcon(R.drawable.ic_notification) 
     .setVisibility(Notification.VISIBILITY_PUBLIC) 
     .setUsesChronometer(true) 
     .setContentIntent(createContentIntent(description)) // Create an intent that would open the UI when user clicks the notification 
     .setContentTitle(description.getTitle()) 
     .setContentText(description.getSubtitle()) 
     .setLargeIcon(art); 

setNotificationPlaybackState(notificationBuilder); 
if (fetchArtUrl != null) { 
    fetchBitmapFromURLAsync(fetchArtUrl, notificationBuilder); 
} 

return notificationBuilder.build(); 

}

et essayer de suivre le tutorial car il n'y a pas de problème dans la version Android, il est tout simplement pas montrer la notification lollipop also.Or vous pouvez même copier juste le Tutoria suivant également tutorial ou

Notification.MediaStyle style = new Notification.MediaStyle(); 

Intent intent = new Intent(getApplicationContext(), MediaPlayerService.class); 
intent.setAction(ACTION_STOP); 
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 1, intent, 0); 
Notification.Builder builder = new Notification.Builder(this) 
     .setSmallIcon(R.drawable.ic_launcher) 
     .setContentTitle("Media Title") 
     .setContentText("Media Artist") 
     .setDeleteIntent(pendingIntent) 
     .setStyle(style); 

essayer d'utiliser le style de notification thats la question si vous êtes en mesure d'obtenir le style l'écran de verrouillage affichera automatiquement.