ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity×Android 通知(Notification)の登録(Android10, 11)

f:id:tomo_mana:20220330165818p:plain


Android Developer サイトに書いてあるものと大体同じではあるのですが、Developer サイトで理解しにくい部分を補足しました。自分の備忘用です。


この説明を見た後、Android Developer サイトを見ると、サイトの説明がより分かりやすく感じるかと思います。

この記事では、通知を作成するための最小手続きを示します。以下が分かれば、拡張することはさほど難しくないと思います。(Builderパターンの使い方さえ分かっていれば。)

通知

通知(Notification)

通知は、画面上に表示されるポップアップのようなもので、以下のような表示がされます(ヘッドアップ通知)。ヘッドアップ通知が行われた後、画面左上のステータスバーに小さいアイコンで表示され続けます。


ヘッドアップ通知

f:id:tomo_mana:20220310163911p:plain
ヘッドアップ通知(Android Developer サイトからの抜粋)


アイコンと通知ドロワー
画面左上の通知アイコンが表示されている領域(ステータスバー)を下にスワイプすると、通知ドロワー上に、それぞれの通知が表示されます。

f:id:tomo_mana:20220310162641p:plain
通知(Android Developer サイトからの抜粋)

通知の概要  |  Android デベロッパー  |  Android Developers


通知チャンネル(Notification Channel)

通知チャンネルは、通知をクリックしたときに表示される、アプリケーションの各通知の設定を管理するスロットのようなもの。


通知チャンネルは、Androidにインストールされている 設定アプリと設定[アプリ名]通知 を選択すると表示されます。

f:id:tomo_mana:20220310163059p:plain
通知チャンネル


特徴・注意点
●各アプリは、それぞれ1つ以上の通知チャンネルを持つことができ、各通知チャンネルは1つ以上の通知を登録することができます。

●通知チャンネルは、通知を作成する前に用意しておく必要があります。

●発行された通知は、後から表示を更新することができます(調査中)。

通知管理クラス(NotificationManager)

通知は、通知と通知チャンネル、それらを紐づける通知管理クラス(NotificationManager)で構成されています。

f:id:tomo_mana:20220310150353p:plain
関係図


Developer サイトや、通知を実装したコードを見ると、いろんな名前が出てきて、関係性を理解するのに少し時間がかかります。

まずは通知とチャンネルを統合する管理クラスがいると覚えておくと良いと思います。


●通知と通知チャンネルは、それぞれ通知管理クラス(NotificationManager)に登録します。

●NotificationManager にリクエストされた通知(Notification)は、通知チャンネルが持つチャンネルID(任意の文字列)で識別されます。

実装手順

通知管理クラスはシステムリソースのため新規作成はできず、通知管理クラスに通知チャンネルと通知を作って登録します。

先に通知チャンネルを作って、その後に通知を作ります。

通知チャンネルは new しますが、通知はBuilderを使用します。


必要なインポート

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;


NotificationManager は Notification Channel を登録する時、
xxCompat は Notification を登録する時に必要。

通知チャンネルの作成と登録

通知チャンネルの作成
new します。Notification Channelクラスは、おそらくただの入れ物です。

 // チャンネルIDは任意の文字列
// ただし通知側は正しい チャンネルID を指定する必要
String CHANNEL_ID = "channelId";

// 通知チャンネルに表示されるタイトル
String title = "notification Channel title";

// Notification Channel 生成(new する)
NotificationChannel channel = new NotificationChannel(
        CHANNEL_ID, title , NotificationManagerCompat.IMPORTANCE_DEFAULT);


通知チャンネルの登録
NotificationManager のインスタンス(シングルトン)から、createNotificationChannel() で登録します。

// Context を取得。Activity でも Service でも以下でOK
Context context = getApplicationContext();

// NotificationManager のインスタンスを取得。Context から取得する
NotificationManager notificationManager =
        (NotificationManager)context.
                getSystemService(Context.NOTIFICATION_SERVICE);

// 通知チャンネルの登録
notificationManager.createNotificationChannel( channel );

通知の作成と登録

通知の作成
NotificationCompat.Builder() を使用します。

Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
        //.setSmallIcon(android.R.drawable.drawable_name)
        .setSmallIcon( getResources().getIdentifier( "drawable_name", "drawable", getPackageName() ))
        .setContentTitle("title")
        .setContentText("short description")
        .build();


通知の登録
NotificationManagerCompat のインスタンスを使って、通知を依頼します。

// 変数 notification は、先ほど作った Notification のインスタンス
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);
notificationManagerCompat.notify( 1, notification );


※通知の依頼は、setForeground() を使用することもあります。

通知アイコンについて

通知のアイコンのうち、Small Iconだけは設定が必須です(setSmallIcon)。


setSmallIcon() さえ呼んであげれば、アイコンのアドレスが間違っていても(正しく取得できなくても)それなりに動作しました。
(■または●のアイコンになる)
※環境による違いはあるかもしれません

setSmallIcon() を呼ばないと、通知そのものが作られません

アイコンの大きさ(24px~96px)

Androidが出している公式の資料が見つけられていませんが、以下に従うものと思われます。
Android Icon Sizes made simple - Icon size guide by Icon Experts

以下は、上記サイトからの抜粋です。

f:id:tomo_mana:20220310152136p:plain
通知画像サイズ
f:id:tomo_mana:20220310185725p:plain
通知画像サイズ

最小サイズとなるmdpiは24pxで、うち画像部分は22pxである必要があります。

白と透明色なので画面上では見えないかもしれませんが、以下に作成例を置きます。(後述するAndroidAsset Studioで作成しました)

f:id:tomo_mana:20220310190357p:plain
元の画像(キャプチャ)
f:id:tomo_mana:20220310190102p:plain
作成例(mdpi用 24x24px)
f:id:tomo_mana:20220310190128p:plain
作成例(xxxdpi用 96x96px)


サイズに関して、以下のサイトも参考になりました。
qoopmk.hatenablog.jp

アイコンはオンラインで作れる(AndroidAsset Studio)

アイコンは Android Studio で作成することが推奨されていますが、Android Studio を使わなくても、オンライン上で作成ができるツールが公開されています。アイコンの余白サイズなど、仕様について迷ったら、あまり難しく考えずに、以下のサイトで試しに作ってみた方が早いかもしれません。

Android Asset Studio - Notification icon generator

f:id:tomo_mana:20220310155528p:plain
Notification icon generator - AndroidAsset Studio (online)

※上は通知アイコンの作成用ですが、これ以外のアイコンもこのサイトで作成できます。

アイコンの配置

Android でアイコン画像を参照する時に使われる R.txt は、Unity環境では自動生成してくれません。また、Unityの説明書では、どこにアイコンを置いたらいいか分かりにくいと思います。

アイコンはAsset直下に、Plugins → Android フォルダを作成して、その下に res を置きます。res 以下に、各解像度のデータを置きます。

\Asset
  \Plugins
    \Android
      \res
        \drawable-hdpi
        \drawable-mdpi
        \drawable-xhdpi
        \drawable-xxhdpi
        \drawable-xxxhdpi
f:id:tomo_mana:20220310174231p:plain
アイコンの配置(例)


上記のAndroidAsset Studioで生成したアイコンが、resフォルダ以下のフォルダと同じ構成で生成してくれるので、それをそのままコピペすれば完了します。


(以上)