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 ではないのかと思った。
なんとなく位置情報の方じゃないかと思った。

今日は外出しないので明日だな。

writer: hiro99ma
tags: Android

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