2025/12/30

Android 16で通知を自動的にグループ化されないようにする (アプリ開発者側での話)

この記事を書いている時点ではAndroid 16においてユーザー側で通知のグループ化を無効にする方法はありません。アプリ開発者側での話になります。


Android 13~15までは、通知を作成する時にNotification.Builder#setGroup(java.lang.String)でグループキーを設定しておけばグループ化されず、個別に通知が表示されていました。しかしAndroid 16からこの回避策が効かなくなり、通知を2つ以上出すと自動的にグループ化されるようになってしまいました。

参照: Android 16 が登場

Android パブリックトラッカーでAndroid 16での通知のグループ化をアプリごとでオプトアウトできるようにと要望も上がっていましたが、今のところGoogleはやらないようです。

参照: Per-app setting to opt-out of Android 16 notification grouping


Androidアプリの開発者向けのページの 通知の動作 によるとAndroid 16.0 (API レベル 36) では

次の通知は自動的にグループ化されます。

  • 要約のない通知
  • 子通知のない通知
  • 子通知が 1 つまたは少ない通知

となっています。つまり要約(Summary)があればグループ化されなさそうです。

で、ボタンをタップして通知を出すサンプルコード。


    button.setOnClickListener { v ->
val notification = Notification.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_android)
.setGroup("group-$count")
.setContentText("count=$count")
.build()

notificationManager.notify(count, notification)

val notificationSummary = Notification.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_android)
.setGroup("group-$count")
.setGroupSummary(true)
.build()

notificationManager.notify(Integer.MAX_VALUE - count, notificationSummary)

count++
}

1つの通知につき1つの要約と通知ごとにグループキーを変更する必要があるのでで、少し手間ではありますがこれでグループ化を回避できます。こんな感じになります(エミュレータでやってるので動作が遅いです)。


上の動画でも分かるのですが、いくつも通知を出せるわけではなく6つになるとグループ化されてしまいます。

ソース https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/services/core/java/com/android/server/notification/NotificationManagerService.java#672 を見てみると6個以上になった時にグループ化するように設定されていてこの値は変更できないので6個以上出すのは諦めましょう。


2025/11/17

Android Studioから起動するエミュレータにコマンドラインオプションを設定する

Android Studioから起動するエミュレータにコマンドラインオプションを設定できないかと検索していたら

How to pass command line options to the emulator in Android Studio? - Stack Overflow

に答えがあったので。


起動オプションを設定するには環境変数「studio.emu.params」に値を設定します。注意点としてはスペースを使用せず、「,」 (カンマ)で繋いでいきます。

例えばタイムゾーンを東京にする場合コマンドラインオプションでは

-timezone Asia/Tokyo

と「-timezone」と「Asia/Tokyo」の間にスペースありますが、環境変数で設定する場合、スペースをカンマで置換した形

$ set studio.emu.params=-timezone,Asia/Tokyo

にします。


Android Studio Otter | 2025.2.1 では https://android.googlesource.com/platform/tools/adt/idea/+/refs/tags/studio-2025.2.1/android/src/com/android/tools/idea/avdmanager/AvdManagerConnection.kt#308

で環境変数を取得して設定していました。コミットログを見ると7年以上前からあったらしい。

Diff - dd839c9436e425381256cb2e984305c09a7fbbd9^! - platform/tools/adt/idea - Git at Google

もっと早く知りたかった


2025/07/19

Pixel 6a でバッテリーのサイクル回数を見る

先日発表されたGoogle Pixel 6a バッテリー パフォーマンス プログラム で使用しているPixel 6aが対象だったのと、2025年7月のアップデート (BP2A.250705.008) を入れた後でも、Pixel 6aではバッテリーのサイクル回数が375回以上にならないとサイクル回数が表示されないようです。


なのでバッテリーのサイクル回数を見る方法のメモ書き。


アプリをインストールして見る


「android バッテリー サイクル回数」などで検索すれば出てきます。


コマンドで見る (恐らくAndroid 12以上)


$ adb shell cat /sys/class/power_supply/battery/cycle_count

でサイクル回数が出力されます。
# Pixel 3 (Android 12)でも出力されたのでAndroid 12でもサイクル回数が取得できる?


デバイス診断で見る


Pixel 6aの設定アプリからは消えてしまったサイクル回数はデバイス診断を起動すれば見れます。
amコマンド

$ adb shell am start -n com.android.devicediagnostics/.MainActivity

で起動するか、ショートカットを作成するなどして、デバイス診断を起動をします。

「コンポーネントの状態」 →「バッテリーの状態」でサイクル回数が表示されます。 (初回利用日時は取得できないようです)




アプリを作る(?) (Android 14以上)


Intent intent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
if (intent != null) {
    int cycleCount = intent.getIntExtra(BatteryManager.EXTRA_CYCLE_COUNT, -1);
    ~ cycleCount を画面等に出す ~
}