2016-08-03 1 views
0

Comment faire pour afficher l'illustration lockscreen pour une application chromecast sender exécutant v2.7.0. J'ai passé la meilleure partie d'environ 2 jours à ce sujet sans aucune résolution.Chromecast Sender v2.7.0 lockscreen image

La bibliothèque v2.7.0 a actuellement la méthode suivante dans la classe VideoCastManager.java:

private void setBitmapForLockScreen(MediaInfo video) { 
    if (video == null || mMediaSessionCompat == null) { 
     return; 
    } 
    Uri imgUrl = null; 
    Bitmap bm = null; 
    List<WebImage> images = video.getMetadata().getImages(); 
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     if (images.size() > 1) { 
      imgUrl = images.get(1).getUrl(); 
     } else if (images.size() == 1) { 
      imgUrl = images.get(0).getUrl(); 
     } else if (mContext != null) { 
      // we don't have a url for image so get a placeholder image from resources 
      bm = BitmapFactory.decodeResource(mContext.getResources(), 
        R.drawable.album_art_placeholder_large); 
     } 
    } else if (!images.isEmpty()) { 
     imgUrl = images.get(0).getUrl(); 
    } else { 
     // we don't have a url for image so get a placeholder image from resources 
     bm = BitmapFactory.decodeResource(mContext.getResources(), 
       R.drawable.album_art_placeholder); 
    } 
    if (bm != null) { 
     MediaMetadataCompat currentMetadata = mMediaSessionCompat.getController().getMetadata(); 
     MediaMetadataCompat.Builder newBuilder = currentMetadata == null 
       ? new MediaMetadataCompat.Builder() 
       : new MediaMetadataCompat.Builder(currentMetadata); 
     mMediaSessionCompat.setMetadata(newBuilder 
       .putBitmap(MediaMetadataCompat.METADATA_KEY_ART, bm) 
       .build()); 
    } else { 
     if (mLockScreenFetchTask != null) { 
      mLockScreenFetchTask.cancel(true); 
     } 
     mLockScreenFetchTask = new FetchBitmapTask() { 
      @Override 
      protected void onPostExecute(Bitmap bitmap) { 
       if (mMediaSessionCompat != null) { 
        MediaMetadataCompat currentMetadata = mMediaSessionCompat.getController() 
          .getMetadata(); 
        MediaMetadataCompat.Builder newBuilder = currentMetadata == null 
          ? new MediaMetadataCompat.Builder() 
          : new MediaMetadataCompat.Builder(currentMetadata); 
        mMediaSessionCompat.setMetadata(newBuilder 
          .putBitmap(MediaMetadataCompat.METADATA_KEY_ART, bitmap) 
          .build()); 
       } 
       mLockScreenFetchTask = null; 
      } 
     }; 
     mLockScreenFetchTask.execute(imgUrl); 
    } 
} 

J'ai essayé swaping le album_art_placeholder_large drawable avec ma propre image personnalisée, aucun résultat. Également essayé d'ajouter un bitmap via la ligne suivante:

putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bm) 

mais rien ne fonctionne. Qu'est-ce qui me manque exactement ici? Quelle touche MediaMetadataCompat doit être utilisée pour afficher l'illustration de l'écran de verrouillage? Ou je regarde au mauvais endroit pour commencer?

D'autres liens que je l'ai essayé, mais en vain:

Android MediaMetadata image on lockscreen is zoomed

Adding more fields in MediaMetada GoogleCast

Le document en ligne à partir de maintenant est incroyablement pauvre et ne vous aide pas beaucoup.

Merci!

EDIT: Après un examen plus approfondi, il semble prendre 15 à 20 minutes après le verrouillage de l'appareil pour afficher l'image de verrouillage. Pas certain de pourquoi.

EDIT 2: méthode setupMediaSession.

private void setUpMediaSession(final MediaInfo info) { 
     if (!isFeatureEnabled(CastConfiguration.FEATURE_LOCKSCREEN)) { 
      return; 
     } 
     if (mMediaSessionCompat == null) { 
      ComponentName mediaEventReceiver = new ComponentName(mContext, 
        VideoIntentReceiver.class.getName()); 
      mMediaSessionCompat = new MediaSessionCompat(mContext, "TAG", mediaEventReceiver, 
        null); 
      mMediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS 
        | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 
      mMediaSessionCompat.setActive(true); 
      mMediaSessionCompat.setCallback(new MediaSessionCompat.Callback() { 
       @Override 
       public boolean onMediaButtonEvent(Intent mediaButtonIntent) { 
        KeyEvent keyEvent = mediaButtonIntent 
          .getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
        if (keyEvent != null && (keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PAUSE 
          || keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PLAY)) { 
         toggle(); 
        } 
        return true; 
       } 

       @Override 
       public void onPlay() { 
        toggle(); 
       } 

       @Override 
       public void onPause() { 
        toggle(); 
       } 

       private void toggle() { 
        try { 
         togglePlayback(); 
        } catch (CastException | TransientNetworkDisconnectionException | 
         NoConnectionException e) { 
         LOGE(TAG, "MediaSessionCompat.Callback(): Failed to toggle playback", e); 
        } 
       } 
      }); 
     } 

     mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, 
       AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); 

     PendingIntent pi = getCastControllerPendingIntent(); 
     if (pi != null) { 
      mMediaSessionCompat.setSessionActivity(pi); 
     } 
     if (info == null) { 
      mMediaSessionCompat.setPlaybackState(new PlaybackStateCompat.Builder() 
       .setState(PlaybackStateCompat.STATE_NONE, 0, 1.0f).build()); 
     } else { 
      mMediaSessionCompat.setPlaybackState(new PlaybackStateCompat.Builder() 
       .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1.0f) 
       .setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE).build()); 
     } 

     // Update the media session's image 
     updateLockScreenImage(info); 

     // update the media session's metadata 
     updateMediaSessionMetadata(); 

     mMediaRouter.setMediaSessionCompat(mMediaSessionCompat); 
    } 
+0

Où appelez-vous 'mMediaSessionCompat.setActive (true)'? – ianhanniballake

+0

@ianhanniballake dans la méthode setupMediaSession. J'utilise la bibliothèque 2.7.0 par défaut telle quelle. J'ai mis à jour la question avec la méthode susmentionnée. – user2511882

Répondre

0

Avez-vous défini un style d'album "plus grand" lorsque vous avez défini votre MediaInfo? CCL suppose que vous en avez un plus petit, défini comme index = 0, qui sera utilisé dans la boîte de dialogue notification et mini-contrôleur et contrôleur de routeur média et un plus grand (deuxième image dans MediaInfo, index = 1) qui sera utilisé pour le lockscreen et la télécommande à plein écran. Si ces images sont présentes, CCL les utilise automatiquement. Comme un test, lancez CastVideos-android (v2) et voyez si cela fonctionne pour vous.

+0

parlons-nous de l'appel getMetaData(). GetImages() dans la méthode setBitmapForLockScreen? J'ai débogué cette méthode et apparemment la liste des images Web revient à 0. Cependant, les contrôles étendus, la notification, le mini-contrôleur montrent tous les images correctes – user2511882

+0

Ajouter, même si les images sont nulles, en regardant l'implémentation logique devrait toujours ramasser l'album_art_placeholder_large par défaut et montrer que si rien d'autre n'est disponible, ne devrait-il pas? – user2511882

+0

Comme je l'ai suggéré, s'il vous plaît essayez CastVideos-v2 et voir si cela montre ce problème ou non. –