ブロードキャストアドレスを宛先に指定してUDPメッセージを送信すると、ローカルネットワーク内の全てのクライアントにメッセージを届けることができます。これを利用してローカルネットワーク内の通信相手を自動検出するようなアプリを作っていたのですが、AndroidアプリでUDPメッセージを受け取れないことがありました。完全に受け取れないわけではなく、たまに受け取れたりするし端末によって確実に受け取れるやつがいたりして、不思議なことになってました。
おそらくAndroidの電池周りの最適化の影響などでブロードキャストパケットの受け取りを制限するようになっているのではないかと思い調べてみたところ、こちらの記事に辿り着きました(リンク先英語です)。どうやらブロードキャストパケットを受信する前にWiFiマネージャーのロックを取得しなければいけないようです。
そのためのコードはこちら。
ロックの取得
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
MulticastLock lock = wifi.createMulticastLock("lock");
lock.acquire();
ロックを取得したということは、使い終わったらロックを解放しなければいけません。そのためのコードはこちら。
ロックの解放
lock.release();
これで無事UDPブロードキャスト通信ができるようになりました!