くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

Android13のプッシュ通知について

今回はAndroid13のプッシュ通知について変更点があるので紹介していきたいと思います。

Android 14 ベータ版がリリースされる時期ですが.....見ていってください!

Android 13(targetSdk 33)から、アプリ通知を送るのにユーザーの事前許可が必要になりました。

実装方法も多少の変更がありました。

通知の権限

まずは、POST_NOTIFICATIONSの権限を追加します。 この権限を追加しないとAndroid13ではプッシュ通知の権限を確認するダイアログは表示されません。

<manifest ...>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <application ...>
        ...
    </application>
</manifest>

権限確認ダイアログでは①「許可」を選択する、②「許可しない」を選択する、③どちらのボタンも押さずにダイアログをスワイプして閉じるという3パターンのアクションを取ることができます。

③の場合には権限を未選択状態になるので注意が必要です。

また、Android12以下ではダイアログは表示されないので、今まで通りチャンネルを作成して通知の設定を行なってください。

通知のタイミング

通知のタイミングについては開発者で決めることができます。

ActivityResultLauncherを起動して結果を受け取れるようにします。

private val requestPermissionLauncher =
    registerForActivityResult(ActivityResultContract.RequestPermission()) { isGrant: Boolean ->
    }

下記のようにしてダイアログを表示させます。(どこかのActivityで表示させてください)

if (ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.POST_NOTIFICATIONS,
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
    }

ここまでの実装でプッシュ通知確認のダイアログは表示できるようになり、権限の設定は行えます。 しかし、上記の呼出処理だと、拒否し続けると画面表示のたびに確認ダイアログが表示されることになってしまいます。

PackageManager.PERMISSION_DENIEDで判定すればいいんじゃないのと思ったかもしれないですが、最初の1回目が表示されなくなる可能性が高いため別の方法が良さそうです。

そこで、shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)を使用します。

shouldShowRequestPermissionRationaleは、以前ユーザーがリクエストを許可しなかった場合trueを返します。

しかし、ここでも注意が必要なのですが、何回拒否したのかで結果が変わります。

  • 1回も拒否していない→shouldShowRequestPermissionRationale = false
  • 1回拒否→shouldShowRequestPermissionRationale = true
  • 2回以降拒否→shouldShowRequestPermissionRationale = false

このように1回拒否した時のみtrueを返します。なので、これだけだと判断できない場合には端末情報として許諾したかどうかを保持するなどの追加で必要になるかもしれません。

最後に

開発者側としては微調整が必要になりましたが、使いやすくなったと思います。

プッシュ通知はiOSのフローの方がふさわしいと思っているので近づいてよかったと思いました。

参照

developer.android.com

www.fuwamaki.com

kubiakdev.medium.com