iOSだとダイアログを出してその場でpush通知を許可するか拒否するかをユーザーに促すことが出来る。
androidの場合はそのようにサッと通知設定を変更することは出来ない。
androidのpush通知設定
そもそもandroidの場合はpush通知のパーミッション確認ダイアログが存在しない。Playストアでのダウンロード時の同意ボタンの内容に、push通知が含まれている。そのためandroidではデフォルトでpush通知許可ということになる。
じゃあandroidではpush通知を拒否するすべがないかというとそういうわけではない。アプリやpush通知を送るサーバー側で独自にフラグを持たせて通知するしないを管理することもできるが、システム設定からアプリごとに通知をブロックすることもできる。
システム設定値をいじれるのか
ここで問題になるのは、この値をアプリ側から操作できるのかということ。この値はアプリ側から操作することは出来ない。そのため、もしユーザーがここで通知をブロックしていた場合は上の画面を開いてから値を設定しないといけなくなる。
iOSのようにアプリ内でダイアログを表示して…というように比較的に簡単に操作はできず、ユーザーの手数が増えてしまうことになるがしょうがない。
通知設定値を取得する
通知に関して、ブロックされていたら解除を促したいという動作を要求されることは多そうだ。実際そういうものを作るとしたら、現在の設定値を取得=>ブロックされてたらアプリごとの設定画面を表示、というような流れになると思う。
というわけで、まずは現在の通知設定値を取得する。値の変更ができないだけで、現在値を取得することはできる。
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
boolean areNotificationsEnabled = notificationManagerCompat.areNotificationsEnabled();
これで今の設定値(boolean)を取得できる。ただしareNotificationsEnabled
はサポートライブラリがv24でないと使えないので注意。
android4.3以下の場合、そもそもシステム側でアプリごとの通知許可orブロックという機能がないため、それと通知許可orブロックできるバージョンとの足並みを揃えるためにcompatを使っている。
アプリごとの設定画面を開く
startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));
この1行でアプリごとの設定画面を開ける。ただし、これだけだと最近開いたアプリケーションにその設定画面が出てきたりスタックに入っちゃったりするので、お好みでintentのフラグを適当に設定したほうがいいかもしれない。
Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + context.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(i);