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" />
Comprobar el permiso PACKAGE_USAGE_STATS
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
}
Obtener lo que ocupa Data, Cache
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()
}
Enlaces
- Puedes ver el código fuente del experimento en este Git
- Documentación oficial de UsageStatsManager