Android9でNotificationが表示されません。。

Androidアプリ開発で、つまずいた所があったのでメモ。

リマインドのために、ステータスバーに通知を定期的に表示してるんですが、Android9で表示できず。。。

こちらの本を参考に、通知機能を実装しました。

SBクリエイティブ
¥3,080 (2024/04/14 19:14時点 | Amazon調べ)

通知機能自体も、こちらの本のコードを参考に構築しました。

Androidアプリ開発は、この手の事象は多く発生するだろうな~これからも。

Androidのバージョン一覧

先におさらいをしておくと、

下記の表のようにAndroidバージョンがあるんですが、それぞれAPIレベルコードネームがあります。

皆さんも困ったときにググって、それを参考に対応することもあるかと思いますが、Androidバージョンで語っていたり、APIレベル・コードネームだったり、まちまちなんですよね。そんな時は、この表を思い出してください。

今回は、Android9で動かなかったので、Android9 API28 に対応していく必要があります。

AndroidAPIコードネーム
Android 4.419KITKAT
Android 521LOLLIPOP
Android 623MARSHMALLOW
Android 724NOUGAT
Android 826OREO
Android 928PIE
Android 1029Q

やはり公式ドキュメント

今回対応したい、通知に関する公式ドキュメントは、こちらですね。

「Android 8.0以上では、、、」と、数カ所記載があります。

Android 8.0以上とそれ以前のバージョンで、大きな違いがあるようです。

気になる記載としては、

Android 8.0 以上では、通知を送信する前に通知チャネルを作成する必要があるため、アプリが起動したらすぐにこのコードを実行する必要があります。
既存の通知チャネルを作成してもオペレーションは実行されないので、これを繰り返し呼び出しても問題ありません。

多分これじゃないでしょうか。

対応内容

公式ドキュメントにあるとおり、

「通知チャンネルを作成する必要がある」

ってことですね。作りましょう!

実装コード

これは、公式ドキュメントにそのままのものがあるので、それを既存コードに追記していくことになります。

nameとdescriptionTextは、取得しているコードになっていますが、私はリテラルで指定してしまいました。

    private fun createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val name = getString(R.string.channel_name)
            val descriptionText = getString(R.string.channel_description)
            val importance = NotificationManager.IMPORTANCE_DEFAULT
            val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
                description = descriptionText
            }
            // Register the channel with the system
            val notificationManager: NotificationManager =
                getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(channel)
        }
    }

実装する場所

Activityを継承しているClassだったら、どれでも大丈夫かと思うんですが、

「アプリが起動したらすぐにこのコードを実行する必要があります。」

なんて記載がありますので、MainActivityで実装しておけばOK。

そして、createNotificationChannel を onStart()で呼び出しました。