我在NotificationCompat v7
上遇到android 8,9
的麻烦。
在所有Android版本上显示通知的最佳方法是什么
调试日志
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=null pri=0 contentView=null vibrate=null sound=null tick defaults=0x0 flags=0x40 color=0x00000000 vis=PRIVATE)
MinSDK = 18,TargetSDK = 28,Android Gradle插件版本= 3.4.1,gradle版本= 5.1.1
如何解决此问题,对此有什么好的解决办法?
我的gradle文件
dependencies {
implementation "com.android.support:support-core-utils:28.0.0"
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:2.0.0-alpha5'
testImplementation 'junit:junit:4.13-beta-2'
'com.android.support.test:runner:1.0.2'
implementation "com.android.support:support-core-utils:28.0.0"
implementation 'com.google.code.gson:gson:2.8.5'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:support-compat:28.0.0'
}
@Override
public void onCreate() {
super.onCreate();
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
hotspotControl = HotspotControl.getInstance(getApplicationContext());
m_notificationStopActionReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (null != intent && WIFI_AP_ACTION_STOP.equals(intent.getAction()))
disableHotspotAndStop();
}
};
registerReceiver(m_notificationStopActionReceiver, new IntentFilter(WIFI_AP_ACTION_STOP));
//Start a foreground with message saying 'Initiating Hotspot'. Message is later updated using SHARE_SERVICE_NOTIFICATION_ID
startForeground(SHARE_SERVICE_NOTIFICATION_ID, getNotification(getString(R.string.p2p_sender_service_init_notification_header), false));
hotspotCheckHandler = new HotspotChecker(this);
}
protected android.support.v4.app.NotificationCompat.Action getStopAction() {
Intent intent = new Intent(WIFI_AP_ACTION_STOP);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return new android.support.v4.app.NotificationCompat.Action.Builder(android.R.drawable.ic_menu_close_clear_cancel, "Stop", pendingIntent).build();
}
答案 0 :(得分:0)
您需要使用Notification Channel在Android 8.0+设备上显示通知。
您可以使用以下代码通过getShareThemNotification(...)
方法生成通知。
NotificationManager notificationManager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel("channel_id",
"Channel Name", NotificationManager.IMPORTANCE_HIGH);
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.GREEN);
notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
notificationManager.createNotificationChannel(notificationChannel);
Notification.Builder builder = new Notification.Builder(context, "channel_id");
notification = builder.setContentTitle({"Title"})
.setContentText({"Message"})
.setAutoCancel(true)
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(pendingIntent).build();
} else {
Notification.Builder builder = new Notification.Builder(context);
notification = builder.setContentTitle({"Title"})
.setContentText({"Message"})
.setAutoCancel(true)
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(pendingIntent).build();
}
notificationManager.notify(id, notification);