とあるお仕事で、アプリのオフライン時の処理を実装することがありました。

「ネットワークに繋がっていない場合、エラーダイアログを表示させる」とかですね。
実は、ネットワークの接続状況を判定するためのクラスがあるので、それを今回紹介したいと思います!
そもそも、どういう場面で使うの?
ネットワーク接続状況を判定する場面は以下の通りです。
- オフラインならエラーのダイアログを表示する
- WiFi接続時のみダウンロードさせたいコンテンツがある
ゲームアプリなどでよく「WiFi接続時に〜…」とか表示されますね。
(時間があれば)ネットワーク通信の種類についても知っておこう!
スマホには様々な種類のネットワーク接続方法があります。
WiFi、モバイル通信、Bluetoothなど……。
詳しく知りたい人は、下記のリンク先後半にあります。
『TYPE_』でページ内検索をすると見つかりますよ。

ConnectivityManager を使ってみる
早速、実際に実装していきましょう!
公式ドキュメントには、以下のように記載されています。
- ConnectivityManager
- ネットワーク接続の状態に関するクエリに応答します。
- また、ネットワーク接続が変更されたときにアプリに通知します。
- NetworkInfo
- 特定のタイプ(現在のところ、モバイル接続か Wi-Fi 接続)のネットワーク、インターフェースのステータスを示します。
※ちなみに、NetworkInfoはAPI29からデプリケート(非推奨)になっています。
公式ドキュメントの具体例を基に、処理を書いてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager var isWiFiConnection: Boolean = false var isMobileConnection: Boolean = false connectivityManager.allNetworks.forEach { network -> connectivityManager.getNetworkInfo(network).apply { if (type == ConnectivityManager.TYPE_WIFI) { isWiFiConnection = isWiFiConnection or isConnected } if (type == ConnectivityManager.TYPE_MOBILE) { isMobileConnection = isMobileConnection or isConnected } } } android.util.Log.d("TEST", "WiFi: ${isWiFiConnection}, Mobile: ${isMobileConnection}") } |
おそらく、connectivityManagerあたりでエラーが起きると思います。
Manifestファイルにパーミッションを追加したら解決しますよ。
1 |
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" |

applicationタグの上あたりに追記すればOKです👌
実装したあとのログ結果
ログで確認したところ、結果は以下のようになりました。
- WiFi
- 接続時:isWiFiConnection = true
- 遮断時:isWiFiConnection = false
- モバイル通信
- 接続時:isMobileConnection = true
- 遮断時:isMobileConnection = true

『or』でisConnectedを判定しているからでしょうか。
うーん。少し思っていた結果とは異なりましたね。
もっと簡単に、オフラインかどうかを確認する
結果が想定と違いましたが、気を取り直して別の方法を試していきましょう!
1 2 3 4 5 |
fun isOnline(): Boolean { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connectivityManager.activeNetworkInfo return networkInfo?.isConnected == true } |
このメソッドを使って、戻り値を確認したところ、WiFiかモバイル通信がONになっている状態だと『true』が返ってきました!
getActiveNetworkInfo()は、検出された最初の接続済みネットワークをNetworkInfoインスタンスで返してくれます。
妥協してはいかん
しかしここで問題が…!
上記で使用したactiveNetworkInfo
は、deprecated(非推奨)になっているんです。。。
非推奨のメソッドは、後々使えなくなってしまうので、対応せずに放置しておくとアプリがクラッシュする可能性が出てきます。
ということで、新しいOSに対応した処理の書き方は、下記の記事で(投げやり)
感想

そもそもdeprecatedになるやつを
公式ドキュメントで紹介してるってどういうことや!!!

確かに。。。
参考

チームのスキルアップに役立つAndroid開発テクニック
KotlinとJetpackの使い方、作ったアプリを成長させるためにやるべきこと、運用保守チームとのコミュニケーションなど、Androidプログラミング技術者が良いコードを書き、ステップアップするために必要なテクニックを解説しています。