データ使用量をモバイル通信と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のプログラムのパッケージの名前です。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます