20GBまでのプランがMNO4社とも出揃いましたね。MNOの割に安い
本題
Androidで通信量を取得したい。
AOSPの通信量を表示する設定項目を見てみる
興味なければ#モバイルデータ利用量を取得するメソッドまで飛ばしてもいいよ。読んでもいいけど
Androidの設定アプリのソースコードを追いかけて、通信量を表示している部分を見つけます。
AOSPミラーGitHub:https://github.com/aosp-mirror/platform_packages_apps_settings
どこにあるの?
日本語のローカライズで使うstring.xml
を開いて、そこからモバイルデータ利用量を表示している設定で使ってる文字列を探す。
見つけたらそのname属性の値を使って検索をかければ見つけられると思う。
とりあえずそれっぽいのを見つけたのでこれで検索をかける
これで検索をかけると、DataUsageSummaryPreferenceController.java
ってのにたどり着きます
そしたら、モバイルデータ利用量に関係してそうな部分を探します。こことかどうでしょう?
usageLevel
ってのはどこから来てるかというと、
DataUsageController
ってのから取得しているそうですので、DataUsageController
を探します。
ところが、DataUsageController
が見つかりません。
しゃーないのでGoogleで検索をするとplatform_frameworks_base/blob/master/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
だそうです。
DataUsageController.java
を開き、getDataUsageInfo()
を探します。ありました。もうゴールは近い
DataUsageController#getUsageLevel
を見ます
ここで使っているquerySummaryForDevice
は、@hide
されているので使えませんが、@hide
のついていないquerySummaryForDevice
もありました。
モバイルデータ利用量を取得するメソッド
クラス名#メソッド名
みたいに#
で区切る書き方があってるのかどうかは知らない 1
NetworkStatsManager#querySummaryForDevice(
int networkType,
String subscriberId,
long startTime,
long endTime
)
ここで悲報です。subscriberId
はAndroid 10からサードパーティアプリでは取れません。
しかし、リファレンスを読んでみると
parameters | description |
---|
subscriberId | 文字列。該当する場合は、ネットワーク・インターフェイスのサブスクライバ ID。API レベル 29 以降、subscriberId は追加の制限によって保護されます。subscriberId にアクセスするための新しい要件を満たしていないアプリを呼び出すと、すべてのモバイルネットワークの使用状況を受信するために、モバイルネットワークの種類を照会する際に NULL 値を提供することができます。詳細については、TelephonyManager#getSubscriberId() を参照してください。(Deepl翻訳:https://www.deepl.com/translator) |
null
を渡せばモバイルデータ利用量を取得できるっぽい。
でも複数SIMが刺さってたらどうなるんだろうね?
作る
なまえ | あたい |
---|
Android | 11 |
実機 | Pixel 3 XL |
minSdkVersion | 23 |
activity_main.xml
最初から置いてあるTextViewにIDを振っておいてください。適当にactivity_main_text_view
とでも
AndroidManifest.xml
「PACKAGE_USAGE_STATS
」権限が必要です。しかもダイアログ形式ではない、設定画面に誘導するタイプのやつです。
MainActivity.kt
権限を確認、もらうコードを書く
権限の確認もいつものメソッドが使えないのでコードを書く必要があります。
参考:https://stackoverflow.com/questions/28921136/how-to-check-if-android-permission-package-usage-stats-permission-is-given
これを使って、権限がなければ取得する画面へ飛ばすようにします
モバイルデータ利用量を取得する
とりあえず今月の利用分を取得する関数を書いてみる
最後にTextViewに入れるようにして完成
結果
多分あってる(AOSP見て作ったんだからそりゃそうだろ)
全部くっつけたコード
終わりに
ソースコード置いておきます。
https://github.com/takusan23/MobileDataUsage
AOSPのソースコード読むところいらんかった気がする