UsageStatsManager es una nueva API introducida en Android 5.0 Lollipop (API Nivel 21) que nos permite recuperar estadísticas sobre el uso de las aplicaciones instaladas en el dispositivo. Con esa API podemos obtener los diferentes espacios que ocupa una aplicación, su total, data y cache
Para usar el UsageStatsManager
debemos añadir el permiso en nuestra app en AndroidManifest.xml
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
Para comprobar si el permiso está otorgado, usaremos loa función hasPermissionPackageUsageStats
devuelve un booleano
private fun hasPermissionPackageUsageStats(): Boolean {
val appOpsManager = this.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
val mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, Process.myUid(), this.packageName)
return if (mode == AppOpsManager.MODE_DEFAULT) {
this.checkCallingOrSelfPermission(Manifest.permission.PACKAGE_USAGE_STATS) == PackageManager.PERMISSION_GRANTED
} else {
mode == AppOpsManager.MODE_ALLOWED
}
}
Si no está otorgado deberemos pedir al usuario que de acceso desde la ventana de configuración del sistema “Applicaciones con acceso al uso”
if (!hasPermissionPackageUsageStats) {
startActivity(Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY))
} else {
//obtener espacios
}
Definimos la variable packageName con el id del paquete, por ejemplo:
com.android.vending
Y con el método queryStatsForPackage se puede obtener lo que ocupa el paquete/aplicación, disponible a partir de Android O
try {
val storageStatsManager: StorageStatsManager =
getSystemService(Context.STORAGE_STATS_SERVICE) as StorageStatsManager
val storageManager: StorageManager =
getSystemService(Context.STORAGE_SERVICE) as StorageManager
val stats: StorageStats = storageStatsManager.queryStatsForPackage(
StorageManager.UUID_DEFAULT, packageName, Process.myUserHandle()
)
Log.d(TAG, "app size" + android.text.format.Formatter.formatShortFileSize(this, stats.appBytes))
Log.d(TAG, "data size" + android.text.format.Formatter.formatShortFileSize(this, stats.dataBytes))
Log.d(TAG, "cache size" + android.text.format.Formatter.formatShortFileSize(this, stats.cacheBytes))
} catch (e: Exception) {
e.printStackTrace()
}