不在Android 9.0上显示通知,并且在8及以下版本上运行良好。我遇到了旧代码的问题,我读到需要在新的Android版本上传递频道,我从互联网上获取此代码,但仍然无法在Android 9.0上运行。我不知道为什么。任何帮助将不胜感激。
当我通过互联网阅读时,一切都很好。但通知没有显示。
private void showSmallNotification( int icon, String title, String message, String timeStamp, PendingIntent resultPendingIntent){
String CHANNEL_ID = Constants.ChannelID;
String CHANNEL_NAME = "Notification";
NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);;
NotificationCompat.Builder notification;
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.addLine(message);
if (Build.VERSION.SDK_INT >= 26) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
channel.enableVibration(true);
channel.setLightColor(Color.BLUE);
channel.enableLights(true);
channel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getApplicationContext().getPackageName() + "/" + R.raw.notification),
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build());
channel.canShowBadge();
notificationManager.createNotificationChannel(channel);
notification = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID);
} else {
notification = new NotificationCompat.Builder(getApplicationContext(),CHANNEL_ID);
}
notification
.setVibrate(new long[]{0, 100})
.setPriority(Notification.PRIORITY_MAX)
.setLights(Color.BLUE, 3000, 3000)
.setAutoCancel(true)
.setContentTitle(title)
.setContentIntent(resultPendingIntent)
.setWhen(getTimeMilliSec(timeStamp))
.setSmallIcon(R.mipmap.ic_launcher)
.setStyle(inboxStyle)
.setLargeIcon(BitmapFactory.decodeResource(this.getResources(), icon))
.setContentText(message)
.build();
notificationManager.notify(CHANNEL_ID, 1, notification.build());
}
我认为问题是你在setChannelId()
上没有notificationBuilder
。 (我冒昧地将notification
重命名为notificationBuilder
,因为它就是这样。)
我在其中一行代码中删除了一个多余的分号。
另请注意,canShowBadge()
是一个返回值的类方法,但不设置任何通知设置。我用setShowBadge(true)
取而代之。
请阅读我在代码片段中留下的评论以获取更多信息。
private void showSmallNotification( int icon, String title, String message, String timeStamp, PendingIntent resultPendingIntent){
String CHANNEL_ID = Constants.ChannelID;
String CHANNEL_NAME = "Notification";
// I removed one of the semi-colons in the next line of code
NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.addLine(message);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// I would suggest that you use IMPORTANCE_DEFAULT instead of IMPORTANCE_HIGH
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
channel.enableVibration(true);
channel.setLightColor(Color.BLUE);
channel.enableLights(true);
channel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getApplicationContext().getPackageName() + "/" + R.raw.notification),
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build());
//channel.canShowBadge();
// Did you mean to set the property to enable Show Badge?
channel.setShowBadge(true);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID)
.setVibrate(new long[]{0, 100})
.setPriority(Notification.PRIORITY_MAX)
.setLights(Color.BLUE, 3000, 3000)
.setAutoCancel(true)
.setContentTitle(title)
.setContentIntent(resultPendingIntent)
.setWhen(getTimeMilliSec(timeStamp))
.setSmallIcon(R.mipmap.ic_launcher)
.setStyle(inboxStyle)
.setLargeIcon(BitmapFactory.decodeResource(this.getResources(), icon))
.setContentText(message);
// Removed .build() since you use it below...no need to build it twice
// Don't forget to set the ChannelID!!
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
notificationBuilder.setChannelId(ID_SPECIAL_OFFER_NOTIFICATION);
}
notificationManager.notify(CHANNEL_ID, 1, notificationBuilder.build());
}
是的,这已经回答了,但需要帮助
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int returnFlag = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createNotificationChannel();
Notification.Builder builder = new Notification.Builder(this, ANDROID_CHANNEL_ID)
.setContentTitle(getString(R.string.app_name))
.setContentText("Mytrux Running")
.setAutoCancel(true);
Notification notification = builder.build();
startForeground(NOTIFICATION_ID, notification);
returnFlag = START_NOT_STICKY;
} else {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setContentTitle(getString(R.string.app_name))
.setContentText("Mytrux is Running...")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setAutoCancel(true);
Notification notification = builder.build();
startForeground(NOTIFICATION_ID, notification);
returnFlag = START_STICKY;
}
mHandlerTask.run();
return returnFlag;
}
并添加此方法
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
ANDROID_CHANNEL_ID,
"Foreground Service Channel",
NotificationManager.IMPORTANCE_DEFAULT
);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(serviceChannel);
}
}
不要忘记在清单中添加服务。