web-dev-qa-db-ja.com

Android通知がAPI 26に表示されない

最近アプリをAPI 26に更新しましたが、コードを変更することなく通知が機能しなくなりました。

val notification = NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle("Title")
                .setContentText("Text")
                .build()
(getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).notify(1, notification)

なぜ機能しないのですか?私が知らないAPIにいくつかの変更はありましたか?

11
ByteDuck

ドキュメント から:

Android Oでは、ユーザーが通知を管理するのに役立つ統合システムを提供する通知チャネルが導入されています。 Android Oを対象とする場合、ユーザーに通知を表示するには、1つ以上の通知チャネルを実装する必要があります。 Android Oをターゲットにしないでください。アプリは、Android 7.0で実行した場合と同じように動作しますAndroid Oデバイス。

(強調を追加)

このNotificationをチャンネルに関連付けていないようです。

15
CommonsWare

ここで私はいくつかの簡単な解決策を投稿します

public void notification(String title, String message, Context context) { 
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

    int notificationId = createID();
    String channelId = "channel-id";
    String channelName = "Channel Name";
    int importance = NotificationManager.IMPORTANCE_HIGH;

    if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.O) {
        NotificationChannel mChannel = new NotificationChannel(
                channelId, channelName, importance);
        notificationManager.createNotificationChannel(mChannel);
    }

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, channelId)
            .setSmallIcon(R.drawable.app_logo)//R.mipmap.ic_launcher
            .setContentTitle(title)
            .setContentText(message)
            .setVibrate(new long[]{100, 250})
            .setLights(Color.YELLOW, 500, 5000)
            .setAutoCancel(true)
            .setColor(ContextCompat.getColor(context, R.color.colorPrimary));

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addNextIntent(new Intent(context, MainAcivity.class));
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(resultPendingIntent);

    notificationManager.notify(notificationId, mBuilder.build());
}

public int createID() {
    Date now = new Date();
    int id = Integer.parseInt(new SimpleDateFormat("ddHHmmss", Locale.FRENCH).format(now));
    return id;
}
6
Sofiane Majdoub