0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Android9でNotificationが表示されない~ので対応

Last updated at Posted at 2019-12-29

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

転載元

当記事は以下ブログからの転載です。
TECH BACK

はじめに

リマインドのために、ステータスバーに通知を定期的に表示してるんですが、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()で呼び出しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?