问题
In a Service extending the new (SDK18, JB-4.3) NotificationListenerService
, I'd like to get the Notification's status bar icon.
mStatusBarNotification.getNotification().icon
returns the resource id of the status bar drawable, but that resource id is naturally not within my app's scope/resources. There's also mStatusBarNotification.getNotification().largeIcon
(returning a Bitmap
), but that's not set for all notifications and returns the "wrong" icon (the image in the expanded notification drawer).
回答1:
Use getPackageName()
on StatusBarNotification
to find out the app that posted the Notification
. You can then use createPackageContext() to get a Context
for that package, then use that Context
to retrieve the image (e.g., via getResources()
).
回答2:
This is the alternative workaround.
We can get drawable from sbn.getNotification().extras.getInt("android.icon")
and then use customview to show this drawable in the notification.
This is how to get Drawable using android.icon value:
RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_push_notification);
contentView.setImageViewResource(R.id.image, R.mipmap.ic_launcher);
contentView.setTextViewText(R.id.title, notificationModel.getTitle());
contentView.setTextViewText(R.id.text, notificationModel.getBody());
try {
//now get the context of other app and then get drawable from resoures
Drawable drawable1 = context.createPackageContext(notificationModel.getPackageNmae(), CONTEXT_IGNORE_SECURITY).getDrawable(notificationModel.getIcon());
Bitmap bitmap = drawableToBitmap(drawable1);
contentView.setImageViewBitmap(R.id.image, bitmap);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
My notificationModel
is:
notificationModel.setPackageNmae(sbn.getPackageName());
notificationModel.setTitle(sbn.getNotification().extras.getString("android.title"));
notificationModel.setBody(sbn.getNotification().extras.getString("android.text"));
notificationModel.setIcon(sbn.getNotification().extras.getInt("android.icon"));
notificationModel.setKey(sbn.getId());
来源:https://stackoverflow.com/questions/18044044/notificationlistenerservice-get-notification-icon