前提
android studioでデータ使用量を確認するアプリを作っています。
データ使用量をtextviewに表示することはできたのですが、アプリを再起動しないとデータ使用量の数字が更新されません。(何故か画面を回転してみたら更新された)
実現したいこと
該当のソースコード (MainActivity.kt)
kotlin
package io.github.takogori.datausage import android.annotation.SuppressLint import android.app.AppOpsManager import android.app.usage.NetworkStatsManager import android.content.Context import android.content.Intent import android.net.ConnectivityManager import android.os.Bundle import android.os.Process import android.provider.Settings import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import java.util.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById<TextView>(R.id.activity_main_text_view) if (checkUsageStatsPermission()) { // 権限がある val byte = getMobileDataUsageFromCurrentMonth() // MBへ変換。Byte -> KB -> MB val usageMB = byte / 1024f / 1024f // TextViewに入れる val usageMBkirisute = Math.round(usageMB) textView.text = "$usageMBkirisute MB" } else { // ない startActivity(Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)) } } /** * PACKAGE_USAGE_STATSの権限が付与されているか確認する * @return 権限があればtrue * */ fun checkUsageStatsPermission(): Boolean { val appOpsManager = getSystemService(APP_OPS_SERVICE) as AppOpsManager val mode = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { // Android 10 以降 appOpsManager.unsafeCheckOpNoThrow( AppOpsManager.OPSTR_GET_USAGE_STATS, Process.myUid(), application.packageName ) } else { // Android 9 以前 appOpsManager.checkOpNoThrow( AppOpsManager.OPSTR_GET_USAGE_STATS, Process.myUid(), application.packageName ) } return mode == AppOpsManager.MODE_ALLOWED } /** * 今月のモバイルデータ利用量を取得する。単位はバイト * @return バイト単位で返す * */ @SuppressLint("ServiceCast") fun getMobileDataUsageFromCurrentMonth(): Long { val networkStatsManager = getSystemService(Context.NETWORK_STATS_SERVICE) as NetworkStatsManager // 集計開始の日付その月の最初の日 val startTime = Calendar.getInstance().apply { set(Calendar.DAY_OF_MONTH, 1) set(Calendar.HOUR_OF_DAY, 0) set(Calendar.MINUTE, 0) set(Calendar.SECOND, 0) }.time.time // 集計終了は現在時刻 val endTime = Calendar.getInstance().time.time // 問い合わせる val bucket = networkStatsManager.querySummaryForDevice( ConnectivityManager.TYPE_MOBILE, null, startTime, endTime ) // 送信 + 受信 return bucket.txBytes + bucket.rxBytes } }
補足情報(FW/ツールのバージョンなど)
Android Studioのバージョン:Android Studio Chipmunk | 2021.2.1 Patch 2
使用している言語:kotlin
min sdk version:API23 Android6.0 (Marshmallow)
使用している実機:Pixel5a(android12)

0 コメント