如何在远程视图中使用 Glide?
How to use Glide in remoteViews?
我正在使用 Glide 从服务器加载所有图像,但我在尝试以正确的方式将它们设置为通知和 RemoteControlClientCompat(锁定屏幕时很酷的东西)时遇到故障。我正在开发一个音乐播放器,因此每次更改歌曲时,通知中的歌曲封面都必须更改。我有这段代码,它是第一次工作(尽管图像是从 url 或从可绘制对象加载的),但在第二次调用时却没有。画质没变!更改歌曲时调用 CustomNotification。并在启动时调用 RegisterRemoteClient activity.
如果这不是正确的方法,请说明方法。
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);
}
您需要设置使用 NotificationTarget class 将您的通知图像设置为滑动目标
NotificationTarget notificationTarget = new NotificationTarget(
context,
R.id.iv_album_art,
remoteView,
notification,
NOTIFICATION_ID);
然后以通常的滑行方式使用该目标
Uri uri = ContentUris.withAppendedId(PlayerConstants.sArtworkUri,
mediaitem.getAlbumId());
Glide.with(getApplicationContext())
.asBitmap()
.load(uri)
.into(notificationTarget);
在此处的 Glide 指南中进行了解释
https://futurestud.io/blog/glide-loading-images-into-notifications-and-appwidgets
您可能还想制作专辑封面变化的动画 - 其描述如下:-
https://futurestud.io/blog/glide-custom-animations-with-animate
我正在使用 Glide 从服务器加载所有图像,但我在尝试以正确的方式将它们设置为通知和 RemoteControlClientCompat(锁定屏幕时很酷的东西)时遇到故障。我正在开发一个音乐播放器,因此每次更改歌曲时,通知中的歌曲封面都必须更改。我有这段代码,它是第一次工作(尽管图像是从 url 或从可绘制对象加载的),但在第二次调用时却没有。画质没变!更改歌曲时调用 CustomNotification。并在启动时调用 RegisterRemoteClient activity.
如果这不是正确的方法,请说明方法。
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);
}
您需要设置使用 NotificationTarget class 将您的通知图像设置为滑动目标
NotificationTarget notificationTarget = new NotificationTarget(
context,
R.id.iv_album_art,
remoteView,
notification,
NOTIFICATION_ID);
然后以通常的滑行方式使用该目标
Uri uri = ContentUris.withAppendedId(PlayerConstants.sArtworkUri,
mediaitem.getAlbumId());
Glide.with(getApplicationContext())
.asBitmap()
.load(uri)
.into(notificationTarget);
在此处的 Glide 指南中进行了解释
https://futurestud.io/blog/glide-loading-images-into-notifications-and-appwidgets
您可能还想制作专辑封面变化的动画 - 其描述如下:-
https://futurestud.io/blog/glide-custom-animations-with-animate