hiro99ma blog

android: foreground service で SSID を取りたいがうまくいかない

2025/11/01

先月作っていたアプリをまだいじっている。

やりたいことはいろいろ変わって、今は外出中にメディア音量をゼロにする、ということになっている。
「外出中」の定義は、家にある WiFi ルータに接続していないことと考えている。
なのでフォアグラウンドサービスで ConnectivityManager.NetworkCallback() を動かして onLost() でゼロ音量、onAvailable() で戻す、としていた。

しかし、この通知が外出していてもときどき呼ばれていることに気付いた。
どうなっているのかよくわからないので、とりあえずログに SSID名でも出力すれば何か分かるだろうと考えた。
それがうまくいかない。

API 36 向けに作っていて ses-permission はこうしている。
取得はできているので WIFI_STATE 系はいらないんじゃないかと思っている。自信はない。

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"
        tools:ignore="ForegroundServicesPolicy" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />

SSID 名は onCapabilitiesChanged() で取るものらしいので、こんな感じで取得している。

  val info = (networkCapabilities.transportInfo as? WifiInfo)
  Log.d("SSID", "${info.ssid}")

これで取得できるときはできる。
WifiManager.UNKNOWN_SSID、文字列では "<unknown ssid>" になることもある。 Android端末の電源ボタンを押して画面消灯させ、画面タップなどで復帰させると onCapabilitiesChanged() が呼ばれるのだが、このときはダメなようだ。
コルーチンで connectivityManager.getNetworkCapabilities() を取り直しているが、どうもそういうのではダメなよう。
WifiInfo を見ても、Supplicant state は COMPLETE だし、IPアドレスは取れているし、そこまでいけば SSID くらいわかってるんじゃないのー、という気がする。
その後で SSID 名が分かるくらいでもう一度 onCapabilitiesChanged() が呼ばれると良いのだけど、それはなさそうだ。

これはスマホがロック状態になっているから、そちら側の制限によって取得できないとかだろうか。
確かに、接続している SSID 名がリアルタイムで取得できるとアプリに位置情報がわかることで悪用できそうな気がする。
考えても分からんな。

おそらく onLost() はちゃんと呼ばれるので、音量をゼロにするのはそこでよいだろう。
間違って音量を戻す方が怖いので、SSID 名が取得できないようだったら戻すのは止めるか。
onResume() だと取得できるので、そこまであきらめるか?
でもせっかくフォアグラウンドサービスにしているのになあ。。。

2025/11/02追記

FOREGROUND_SERVICE_DATA_SYNC を使っているけど FOREGROUND_SERVICE_CONNECTED_DEVICEFOREGROUND_SERVICE_TYPE_LOCATION ではないのかと思った。
なんとなく位置情報の方じゃないかと思った。

2025/11/03追記

今日はうまくいったような気がする。
タイミングなのか何なのか分からないけど、絶対に今まで失敗していた、というほどではなかったので1回だけでは何とも言えない。

それよりも、Pixel のルールが作動していない。
WiFi 圏外でのバイブレーションモード移行は成功しているが WiFi 接続時に戻す方が作動していない。
ネットワーク変化のコールバックは 2つ同時に動かないとか、何か制限があるのだろうか?

あ、いまスマホのロックを外したらルールが作動した。
それまでにロック解除したときは作動しなかったし、またバックグラウンド状態での自動復帰はできなかったのだと思われる。

writer: hiro99ma
tags: Android

 
About me
About me
comment
Comment Form
🏠
Top page
GitHub
GitHub
Twitter
X/Twitter
My page
Homepage