データ使用量をモバイル通信とWi-Fiに分けて直近11日間の各1日分を表示するアンドロイドのスマホのアプリ

 データ使用量をLTEなどのモバイル通信とWi-Fiに分けて直近11日間の各1日分を表示するアンドロイドのスマホのアプリを作ってみました。


 著者が利用しているキャリアは直近10日間で10GBまで、直近3日間で3GBまでで超過すると通信速度が制限されてしまいますが、キャリアの公式アプリは3日間の合計の1つしか表示してくれないので自作しました。


 不具合が有るかもしれないので、利用は自己責任でお願いします。


 削除予定の警告が出るメソッドを利用しているのは不安ですが、書き残しておきます。



 データ使用量を表示するアプリには、使用状況へのアクセス権限の許可が必要です。


 AQUOS sense3の場合は、設定>アプリと通知>詳細設定>特別なアプリアクセス>使用状況へのアクセスで、当アプリであるUsedDataSizeViewerに権限を許可します。


 AQUOS sense3、Pixel 7a、FireHD8第12世代2022年で動作を確認できました。


 ちなみに、ConnectivityManager.TYPE_WIFIとは別にTYPE_WIMAXが存在したため、「Wi-FiとWiMAXは別なのか」と思い、TYPE_WIFIと同様のTYPE_WIMAXのプログラム コードを追加した所、NullPointerExceptionが発生してしまったので、追加したコードを削除しました。

 そのため、WiMAXはWi-Fiに含まれていると思うのですが、著者は現在WiMAXを利用していないため、未確認です。



 また、TextViewのtextに半角空白を含む文字を設定してみたら、半角空白の横幅が、かなり狭く表示されてしまいました。



 ※下記のXMLファイルやKotlinのプログラムなどのコードをコピペする場合は、2文字の全角空白を4文字の半角空白に置換してください。



 また、Android StudioにJavaやKotlinなどのプログラムのコードをコピペして、「import android.R」が自動で追加されてしまったら、削除してください。

 「android.R」は、「R.layout.activity_main」や「R.id.◯◯◯」の「R」とは違います。

 そのため、「import android.R」が有ると、コンパイル エラーが発生してしまいます。



 Android StudioにJavaやKotlinなどのプログラムのコードをコピペすると、変数の名前が半角バッククォート記号(`)で囲まれる事が有ります。

 Kotlinでは変数の名前を半角バッククォート記号(`)で囲むと予約語(inやnullなど)や半角空白記号( )などを変数の名前にできるそうです。

 可能であれば、半角バッククォート記号(`)で囲まれた変数の名前は、半角バッククォート記号(`)で囲まずに済む名前に変更したほうが良いのでは、と個人的に思っております。



 ①当アプリが使用状況へのアクセス権限の許可を必要とするという宣言をアンドロイド スマホのアプリのマニフェスト ファイルに追加します。


――――――――――――――――――――

<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />

――――――――――――――――――――


/home/◯◯◯/AndroidStudioProjects/UsedDataSizeViewer/app/src/main/AndroidManifest.xml

――――――――――――――――――――

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

  xmlns:tools="http://schemas.android.com/tools">


  <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />


  <application

    android:allowBackup="true"

    android:dataExtractionRules="@xml/data_extraction_rules"

    android:fullBackupContent="@xml/backup_rules"

    android:icon="@mipmap/ic_launcher"

    android:label="@string/app_name"

    android:supportsRtl="true"

    android:theme="@style/Theme.UsedDataSizeViewer"

    tools:targetApi="31">

    <activity

      android:name=".MainActivity"

      android:exported="true">

      <intent-filter>

        <action android:name="android.intent.action.MAIN" />


        <category android:name="android.intent.category.LAUNCHER" />

      </intent-filter>

    </activity>

  </application>


</manifest>

――――――――――――――――――――

 ◯◯◯はLinux Mintのユーザー名です。

 UsedDataSizeViewerは著者が付けたAndroid Studioのプロジェクトの名前です。



 ②画面に表示する文字のデフォルト設定のXMLファイルに、設定を追加します。


/home/◯◯◯/AndroidStudioProjects/UsedDataSizeViewer/app/src/main/res/values/strings.xml

――――――――――――――――――――

<resources>

  <string name="app_name">UsedDataSizeViewer</string>


  <string name="denied_to_access_usage_status">Now this application does not have the permission to access usage status. So this applicatiopn can not display used data size. Please finish this application.</string>

  <string name="ok">OK</string>


  <string name="update">Update</string>


  <string name="mobile">Mobile</string>

  <string name="wifi">Wi-Fi</string>


  <string name="giga_bytes">GB</string>

</resources>

――――――――――――――――――――

 ◯◯◯はLinux Mintのユーザー名です。

 UsedDataSizeViewerは著者が付けたAndroid Studioのプロジェクトの名前です。



 ③画面に表示する文字の日本語対応の設定のXMLファイルを置くres/values-ja/ディレクトリを用意します。

――――――――――――――――――――

/home/◯◯◯/AndroidStudioProjects/UsedDataSizeViewer/app/src/main/res/values-ja/

――――――――――――――――――――

 ◯◯◯はLinux Mintのユーザー名です。

 UsedDataSizeViewerは著者が付けたAndroid Studioのプロジェクトの名前です。



 ④画面に表示する文字の日本語対応の設定のXMLファイルを、設定します。


 ・アンドロイド システムは日本語の場合はres/values/strings.xmlではなくres/values-ja/strings.xmlの文字を表示してくれます。


/home/◯◯◯/AndroidStudioProjects/UsedDataSizeViewer/app/src/main/res/values-ja/strings.xml

――――――――――――――――――――

<resources>

  <string name="app_name">UsedDataSizeViewer</string>


  <string name="denied_to_access_usage_status">使用状況へのアクセス権限の許可が無いので、当アプリは使用データ容量の表示ができません。当アプリを終了してください。</string>

  <string name="ok">わかりました</string>


  <string name="update">更新</string>


  <string name="mobile">モバイル通信</string>

  <string name="wifi">Wi-Fi</string>


  <string name="giga_bytes">ギガバイト</string>

</resources>

――――――――――――――――――――

 ◯◯◯はLinux Mintのユーザー名です。

 UsedDataSizeViewerは著者が付けたAndroid Studioのプロジェクトの名前です。



 ⑤既存のメインのXMLファイルを、設定します。


/home/◯◯◯/AndroidStudioProjects/UsedDataSizeViewer/app/src/main/res/layout/activity_main.xml

――――――――――――――――――――

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:layout_width="match_parent"

  android:layout_height="match_parent"

  android:orientation="vertical"

>


  <Button

    android:id="@+id/update"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="@string/update"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/todayMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/oneDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

/>


  <TextView

    android:id="@+id/twoDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/threeDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/fourDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/fiveDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/sixDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/sevenDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/eightDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/nineDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/tenDayBeforeMobileUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/todayWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

    android:layout_marginTop="50dp"

  />


  <TextView

    android:id="@+id/oneDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/twoDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/threeDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/fourDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/fiveDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/sixDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/sevenDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/eightDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/nineDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


  <TextView

    android:id="@+id/tenDayBeforeWifiUsedDataSize"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

  />


</LinearLayout>

――――――――――――――――――――

 ◯◯◯はLinux Mintのユーザー名です。

 UsedDataSizeViewerは著者が付けたAndroid Studioのプロジェクトの名前です。



 ⑥アンドロイド スマホのアプリの、画面に1対1対応しているアクティビティという部分で、データ使用量を取得して、画面に設定したりします。


/home/◯◯◯/AndroidStudioProjects/UsedDataSizeViewer/app/src/main/java/eliphas1810/useddatasizeviewer/MainActivity.kt

――――――――――――――――――――

package eliphas1810.useddatasizeviewer


import android.annotation.SuppressLint

import android.app.AlertDialog

import android.app.AppOpsManager

import android.app.usage.NetworkStats

import android.app.usage.NetworkStatsManager

import android.content.Context

import android.net.ConnectivityManager

import android.os.Binder

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import android.widget.Button

import android.widget.TextView

import android.widget.Toast

import java.math.RoundingMode

import java.text.DecimalFormat

import java.text.SimpleDateFormat

import java.util.*



class MainActivity : AppCompatActivity() {



  private fun updateUsedDataSize() {

    try {

      val networkStatsManager = getSystemService(Context.NETWORK_STATS_SERVICE) as NetworkStatsManager


      val simpleDateFormat = SimpleDateFormat("yyyy/MM/dd")


      val decimalFormat = DecimalFormat("0.000")

      decimalFormat.roundingMode = RoundingMode.UP


      val nowCalendar: Calendar = Calendar.getInstance()


      val todayCalendar: Calendar = nowCalendar.clone() as Calendar

      todayCalendar.set(Calendar.HOUR_OF_DAY, 0)

      todayCalendar.set(Calendar.MINUTE, 0)

      todayCalendar.set(Calendar.SECOND, 0)

      todayCalendar.set(Calendar.MILLISECOND, 0)


      val oneDayBeforeCalendar = todayCalendar.clone() as Calendar

      oneDayBeforeCalendar.add(Calendar.DATE, -1)


      val twoDayBeforeCalendar = todayCalendar.clone() as Calendar

      twoDayBeforeCalendar.add(Calendar.DATE, -2)


      val threeDayBeforeCalendar = todayCalendar.clone() as Calendar

      threeDayBeforeCalendar.add(Calendar.DATE, -3)


      val fourDayBeforeCalendar = todayCalendar.clone() as Calendar

      fourDayBeforeCalendar.add(Calendar.DATE, -4)


      val fiveDayBeforeCalendar = todayCalendar.clone() as Calendar

      fiveDayBeforeCalendar.add(Calendar.DATE, -5)


      val sixDayBeforeCalendar = todayCalendar.clone() as Calendar

      sixDayBeforeCalendar.add(Calendar.DATE, -6)


      val sevenDayBeforeCalendar = todayCalendar.clone() as Calendar

      sevenDayBeforeCalendar.add(Calendar.DATE, -7)


      val eightDayBeforeCalendar = todayCalendar.clone() as Calendar

      eightDayBeforeCalendar.add(Calendar.DATE, -8)


      val nineDayBeforeCalendar = todayCalendar.clone() as Calendar

      nineDayBeforeCalendar.add(Calendar.DATE, -9)


      val tenDayBeforeCalendar = todayCalendar.clone() as Calendar

      tenDayBeforeCalendar.add(Calendar.DATE, -10)


      val todayMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, todayCalendar.time.time, nowCalendar.time.time)

      val oneDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, oneDayBeforeCalendar.time.time, todayCalendar.time.time)

      val twoDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, twoDayBeforeCalendar.time.time, oneDayBeforeCalendar.time.time)

      val threeDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, threeDayBeforeCalendar.time.time, twoDayBeforeCalendar.time.time)

      val fourDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, fourDayBeforeCalendar.time.time, threeDayBeforeCalendar.time.time)

      val fiveDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, fiveDayBeforeCalendar.time.time, fourDayBeforeCalendar.time.time)

      val sixDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, sixDayBeforeCalendar.time.time, fiveDayBeforeCalendar.time.time)

      val sevenDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, sevenDayBeforeCalendar.time.time, sixDayBeforeCalendar.time.time)

      val eightDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, eightDayBeforeCalendar.time.time, sevenDayBeforeCalendar.time.time)

      val nineDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, nineDayBeforeCalendar.time.time, eightDayBeforeCalendar.time.time)

      val tenDayBeforeMobileBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, tenDayBeforeCalendar.time.time, nineDayBeforeCalendar.time.time)


      val todayMobileBytes = todayMobileBucket.txBytes + todayMobileBucket.rxBytes

      val oneDayBeforeMobileBytes = oneDayBeforeMobileBucket.txBytes + oneDayBeforeMobileBucket.rxBytes

      val twoDayBeforeMobileBytes = twoDayBeforeMobileBucket.txBytes + twoDayBeforeMobileBucket.rxBytes

      val threeDayBeforeMobileBytes = threeDayBeforeMobileBucket.txBytes + threeDayBeforeMobileBucket.rxBytes

      val fourDayBeforeMobileBytes = fourDayBeforeMobileBucket.txBytes + fourDayBeforeMobileBucket.rxBytes

      val fiveDayBeforeMobileBytes = fiveDayBeforeMobileBucket.txBytes + fiveDayBeforeMobileBucket.rxBytes

      val sixDayBeforeMobileBytes = sixDayBeforeMobileBucket.txBytes + sixDayBeforeMobileBucket.rxBytes

      val sevenDayBeforeMobileBytes = sevenDayBeforeMobileBucket.txBytes + sevenDayBeforeMobileBucket.rxBytes

      val eightDayBeforeMobileBytes = eightDayBeforeMobileBucket.txBytes + eightDayBeforeMobileBucket.rxBytes

      val nineDayBeforeMobileBytes = nineDayBeforeMobileBucket.txBytes + nineDayBeforeMobileBucket.rxBytes

      val tenDayBeforeMobileBytes = tenDayBeforeMobileBucket.txBytes + tenDayBeforeMobileBucket.rxBytes


      findViewById<TextView>(R.id.todayMobileUsedDataSize)?.text = simpleDateFormat.format(todayCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(todayMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.oneDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(oneDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(oneDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.twoDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(twoDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(twoDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.threeDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(threeDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(threeDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.fourDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(fourDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(fourDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.fiveDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(fiveDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(fiveDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.sixDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(sixDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(sixDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.sevenDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(sevenDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(sevenDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.eightDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(eightDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(eightDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.nineDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(nineDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(nineDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.tenDayBeforeMobileUsedDataSize)?.text = simpleDateFormat.format(tenDayBeforeCalendar.time) + "  " + getString(R.string.mobile) + "  " + decimalFormat.format(tenDayBeforeMobileBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)


      val todayWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, todayCalendar.time.time, nowCalendar.time.time)

      val oneDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, oneDayBeforeCalendar.time.time, todayCalendar.time.time)

      val twoDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, twoDayBeforeCalendar.time.time, oneDayBeforeCalendar.time.time)

      val threeDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, threeDayBeforeCalendar.time.time, twoDayBeforeCalendar.time.time)

      val fourDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, fourDayBeforeCalendar.time.time, threeDayBeforeCalendar.time.time)

      val fiveDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, fiveDayBeforeCalendar.time.time, fourDayBeforeCalendar.time.time)

      val sixDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, sixDayBeforeCalendar.time.time, fiveDayBeforeCalendar.time.time)

      val sevenDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, sevenDayBeforeCalendar.time.time, sixDayBeforeCalendar.time.time)

      val eightDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, eightDayBeforeCalendar.time.time, sevenDayBeforeCalendar.time.time)

      val nineDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, nineDayBeforeCalendar.time.time, eightDayBeforeCalendar.time.time)

      val tenDayBeforeWifiBucket: NetworkStats.Bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, tenDayBeforeCalendar.time.time, nineDayBeforeCalendar.time.time)


      val todayWifiBytes = todayWifiBucket.txBytes + todayWifiBucket.rxBytes

      val oneDayBeforeWifiBytes = oneDayBeforeWifiBucket.txBytes + oneDayBeforeWifiBucket.rxBytes

      val twoDayBeforeWifiBytes = twoDayBeforeWifiBucket.txBytes + twoDayBeforeWifiBucket.rxBytes

      val threeDayBeforeWifiBytes = threeDayBeforeWifiBucket.txBytes + threeDayBeforeWifiBucket.rxBytes

      val fourDayBeforeWifiBytes = fourDayBeforeWifiBucket.txBytes + fourDayBeforeWifiBucket.rxBytes

      val fiveDayBeforeWifiBytes = fiveDayBeforeWifiBucket.txBytes + fiveDayBeforeWifiBucket.rxBytes

      val sixDayBeforeWifiBytes = sixDayBeforeWifiBucket.txBytes + sixDayBeforeWifiBucket.rxBytes

      val sevenDayBeforeWifiBytes = sevenDayBeforeWifiBucket.txBytes + sevenDayBeforeWifiBucket.rxBytes

      val eightDayBeforeWifiBytes = eightDayBeforeWifiBucket.txBytes + eightDayBeforeWifiBucket.rxBytes

      val nineDayBeforeWifiBytes = nineDayBeforeWifiBucket.txBytes + nineDayBeforeWifiBucket.rxBytes

      val tenDayBeforeWifiBytes = tenDayBeforeWifiBucket.txBytes + tenDayBeforeWifiBucket.rxBytes


      findViewById<TextView>(R.id.todayWifiUsedDataSize)?.text = simpleDateFormat.format(todayCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(todayWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.oneDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(oneDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(oneDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.twoDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(twoDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(twoDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.threeDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(threeDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(threeDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.fourDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(fourDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(fourDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.fiveDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(fiveDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(fiveDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.sixDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(sixDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(sixDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.sevenDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(sevenDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(sevenDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.eightDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(eightDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(eightDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.nineDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(nineDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(nineDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)

      findViewById<TextView>(R.id.tenDayBeforeWifiUsedDataSize)?.text = simpleDateFormat.format(tenDayBeforeCalendar.time) + "  " + getString(R.string.wifi) + "  " + decimalFormat.format(tenDayBeforeWifiBytes / 1024.0 / 1024.0 / 1024.0).padStart(8, ' ') + getString(R.string.giga_bytes)


    } catch (exception: Exception) {

      Toast.makeText(applicationContext, exception.toString(), Toast.LENGTH_LONG).show()

      throw exception

    }

  }



  //メモリー上に作成される時にのみ呼ばれます。

  @SuppressLint("WrongThread")

  override fun onCreate(savedInstanceState: Bundle?) {

    try {

      super.onCreate(savedInstanceState)

      setContentView(R.layout.activity_main)


      val appOpsManager = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager


      //使用状況へのアクセス権限の許可が無い場合

      if (appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, Binder.getCallingUid(), application.packageName) != AppOpsManager.MODE_ALLOWED) {


        //使用状況へのアクセス権限の許可が無いので、当アプリを実行できない事を説明して、処理を終了

        AlertDialog.Builder(this)

          .setMessage(getString(R.string.denied_to_access_usage_status))

          .setPositiveButton(getString(R.string.ok)) { _, _ ->

          }

          .create()

          .show()


          return

      }


      //更新ボタンが押された時の処理

      findViewById<Button>(R.id.update).setOnClickListener { view ->

        try {

          updateUsedDataSize()


        } catch (exception: Exception) {

          Toast.makeText(view.context.applicationContext, exception.toString(), Toast.LENGTH_LONG).show()

          throw exception

        }

      }


      updateUsedDataSize()


    } catch (exception: Exception) {

      Toast.makeText(applicationContext, exception.toString(), Toast.LENGTH_LONG).show()

      throw exception

    }

  }

}

――――――――――――――――――――

 ◯◯◯はLinux Mintのユーザー名です。

 UsedDataSizeViewerは著者が付けたAndroid Studioのプロジェクトの名前です。

 eliphas1810/useddatasizeviewerは著者が付けたKotlinのプログラムのパッケージのディレクトリの相対パスです。

 eliphas1810.useddatasizeviewerは著者が付けたKotlinのプログラムのパッケージの名前です。

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る