Publicado en Android

Obtener el espacio que ocupa el cache y data de una aplicación con UsageStatsManager Kotlin


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