7

我正在使用Glide從服務器載入所有圖片,但我正在嘗試以正確的方式設置它們,以便通知和RemoteControlClientCompat(帶鎖屏的酷炫物品)。我正在開發一款音樂播放器,因此每次更改歌曲時,通知中的歌曲封面都必須更改。我有這個代碼,它第一次工作(如果圖像是從url或drawable加載的),但不是在第二次調用時。圖像不會改變! CustomNotification在歌曲改變時被調用。並且在開始活動中調用RegisterRemoteClient。如何在remoteViews中使用Glide?

如果這不是正確的方法,請告訴我們。

public void CustomNotification() { 
    Log.d(TAG, "Set custom notification"); 

    simpleRemoteView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification_custom); 
    expandedRemoteView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification_big); 

    mNotification = new NotificationCompat.Builder(getApplicationContext()) 
      .setSmallIcon(R.mipmap.ic_main_logo) 
      .setTicker(mSongTitle + " - " + mSongAuthors) 
      .setContentTitle(mSongTitle).build(); 

    setRemoteListeners(simpleRemoteView); 
    setRemoteListeners(expandedRemoteView); 

    try { 
     //Check if playingSong has a cover url, if not set one from drawable 
     if(!playingSong.has("cover")){ 
      mDummyAlbumArt = BitmapFactory.decodeResource(getResources(),R.drawable.image_song_album); 
      mDummyAlbumArt2 = BitmapFactory.decodeResource(getResources(),R.drawable.image_song_album); 
      mDummyAlbumArt3 = BitmapFactory.decodeResource(getResources(),R.drawable.image_song_album); 
     }else { 
      Glide.with(MainActivity.context) 
        .load(API.imgUrl(playingSong.getString("cover_img"))) 
        .asBitmap() 
        .into(new SimpleTarget<Bitmap>(100, 100) { 
         @Override 
         public void onResourceReady(Bitmap bitmap, GlideAnimation anim) { 
          mDummyAlbumArt = bitmap; 
          mDummyAlbumArt2 = bitmap; 
          mDummyAlbumArt3 = bitmap; 
         } 
        }); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    mNotification.contentView = simpleRemoteView; 
    mNotification.contentView.setTextViewText(R.id.textSongName, mSongTitle); 
    mNotification.contentView.setTextViewText(R.id.textAlbumName, mSongAuthors); 
    mNotification.contentView.setImageViewBitmap(R.id.imageViewAlbumArt, mDummyAlbumArt); 

    if (currentVersionSupportBigNotification) { 
     mNotification.bigContentView = expandedRemoteView; 
     mNotification.bigContentView.setTextViewText(R.id.textSongName, mSongTitle); 
     mNotification.bigContentView.setTextViewText(R.id.textAlbumName, mSongAuthors); 
     mNotification.bigContentView.setImageViewBitmap(R.id.imageViewAlbumArt, mDummyAlbumArt2); 
    } 

    if (mPlayer != null) { 
     if (!mPlayer.isPlaying()) { 
      mNotification.contentView.setImageViewResource(R.id.btnPlayPause, R.mipmap.play); 
      if (currentVersionSupportBigNotification) { 
       mNotification.bigContentView.setImageViewResource(R.id.btnPlayPause, R.mipmap.play); 
      } 
     } else { 
      mNotification.contentView.setImageViewResource(R.id.btnPlayPause, R.mipmap.pause); 
      if (currentVersionSupportBigNotification) { 
       mNotification.bigContentView.setImageViewResource(R.id.btnPlayPause, R.mipmap.pause); 
      } 
     } 
    } 

    mNotification.flags |= Notification.FLAG_ONGOING_EVENT; 
    if(currentVersionSupportBigNotification) { //As priority_max only suported on API 16, the same as big notification 
     mNotification.priority = Notification.PRIORITY_MAX; 
    } 
    startForeground(NOTIFICATION_ID, mNotification); 

    //update remote controls 
    if (currentVersionSupportLockScreenControls) { 
     remoteControlClientCompat.editMetadata(true) 
       .putString(MediaMetadataRetriever.METADATA_KEY_TITLE, mSongTitle + " - " + mSongAuthors) 
       .putBitmap(RemoteControlClientCompat.MetadataEditorCompat.METADATA_KEY_ARTWORK, mDummyAlbumArt3) 
       .apply(); 
    } 
} 

public void setRemoteListeners(RemoteViews remoteViews){ 
    Log.d(TAG,"Setting remote listeners"); 
    PendingIntent piAppActivity = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 
      PendingIntent.FLAG_UPDATE_CURRENT); 
    PendingIntent piPlayPause = PendingIntent.getService(this, 0, new Intent(MusicService.ACTION_TOGGLE_PLAYBACK), PendingIntent.FLAG_UPDATE_CURRENT); 
    PendingIntent piNext = PendingIntent.getService(this, 0, new Intent(MusicService.ACTION_SKIP), PendingIntent.FLAG_UPDATE_CURRENT); 
    PendingIntent piClose = PendingIntent.getService(this, 0, new Intent(MusicService.ACTION_STOP), PendingIntent.FLAG_UPDATE_CURRENT); 
    PendingIntent piPrevious = PendingIntent.getService(this, 0, new Intent(MusicService.ACTION_PREVIOUS), PendingIntent.FLAG_UPDATE_CURRENT); 

    remoteViews.setOnClickPendingIntent(R.id.linearLayoutNotification, piAppActivity); 
    remoteViews.setOnClickPendingIntent(R.id.btnPlayPause, piPlayPause); 
    remoteViews.setOnClickPendingIntent(R.id.btnNext, piNext); 
    remoteViews.setOnClickPendingIntent(R.id.btnDelete, piClose); 
    remoteViews.setOnClickPendingIntent(R.id.btnPrevious, piPrevious); 
} 

private void RegisterRemoteClient(){ 
    // Use the media button APIs (if available) to register ourselves for media button 
    // events 

    MediaButtonHelper.registerMediaButtonEventReceiverCompat(mAudioManager, mMediaButtonReceiverComponent); 
    // Use the remote control APIs (if available) to set the playback state 
    if (remoteControlClientCompat == null) { 
     Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
     intent.setComponent(mMediaButtonReceiverComponent); 
     remoteControlClientCompat = new RemoteControlClientCompat(PendingIntent.getBroadcast(this /*context*/,0 /*requestCode, ignored*/, intent /*intent*/, 0 /*flags*/)); 
     RemoteControlHelper.registerRemoteControlClient(mAudioManager,remoteControlClientCompat); 
    } 

    remoteControlClientCompat.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); 
    remoteControlClientCompat.setTransportControlFlags(
      RemoteControlClient.FLAG_KEY_MEDIA_PAUSE | 
        RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS | 
        RemoteControlClient.FLAG_KEY_MEDIA_NEXT | 
        RemoteControlClient.FLAG_KEY_MEDIA_STOP); 
} 

回答

9

您需要設置使用NotificationTarget類設置您的通知圖像滑行目標

NotificationTarget notificationTarget = new NotificationTarget( 
    context, 
    remoteView, 
    R.id.iv_album_art, 
    notification, 
    NOTIFICATION_ID); 

,然後使用該目標通常滑翔方式

Uri uri = ContentUris.withAppendedId(PlayerConstants.sArtworkUri, 
     mediaitem.getAlbumId()); 

    Glide.with(getApplicationContext()) 
    .load(uri) 
    .asBitmap() 
    .into(notificationTarget); 

據解釋在Glide的指導方針

https://futurestud.io/blog/glide-loading-images-into-notifications-and-appwidgets

你可能還喜歡動畫專輯封面的變化 - 其描述如下: -

https://futurestud.io/blog/glide-custom-animations-with-animate

-3

這爲我工作:

Bitmap bitmap = Glide.with(mContext) 
       .load(YOUR_IMG_URL) 
       .asBitmap() 
       .into(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL) 
       .get(); 
     remoteViews.setImageViewBitmap(R.id.widget_list_item_img,bitmap); 
+1

這可能阻塞線程 –

相關問題