Androidアプリ開発で、つまずいた所があったのでメモ。
リマインドのために、ステータスバーに通知を定期的に表示してるんですが、Android9で表示できず。。。
こちらの本を参考に、通知機能を実装しました。
通知機能自体も、こちらの本のコードを参考に構築しました。
Androidアプリ開発は、この手の事象は多く発生するだろうな~これからも。
Androidのバージョン一覧
先におさらいをしておくと、
下記の表のようにAndroidバージョンがあるんですが、それぞれAPIレベルとコードネームがあります。
皆さんも困ったときにググって、それを参考に対応することもあるかと思いますが、Androidバージョンで語っていたり、APIレベル・コードネームだったり、まちまちなんですよね。そんな時は、この表を思い出してください。
今回は、Android9で動かなかったので、Android9 API28 に対応していく必要があります。
Android | API | コードネーム |
Android 4.4 | 19 | KITKAT |
Android 5 | 21 | LOLLIPOP |
Android 6 | 23 | MARSHMALLOW |
Android 7 | 24 | NOUGAT |
Android 8 | 26 | OREO |
Android 9 | 28 | PIE |
Android 10 | 29 | Q |
やはり公式ドキュメント
今回対応したい、通知に関する公式ドキュメントは、こちらですね。
「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()で呼び出しました。