Here is some code that should have worked.
Private Sub B4XPage_Created (Root1 As B4XView)
Root = Root1
Root.LoadLayout("MainPage")
ListAppsAndDataUsage
End Sub
Sub ListAppsAndDataUsage
Dim pm As PackageManager
Dim apps As List = pm.GetInstalledPackages
For Each packageName As String In apps
Try
Dim uid As Int = GetAppUID(packageName)
Dim usage As Map = GetDataUsageForUID(uid, packageName)
Log("App: " & packageName)
Log(" Received: " & usage.Get("rx") & " octets")
Log(" Sent: " & usage.Get("tx") & " octets")
Catch
Log("Error for " & packageName)
End Try
Next
End Sub
Sub GetAppUID(packageName As String) As Int
Dim joPM As JavaObject
joPM.InitializeContext
joPM = joPM.RunMethod("getPackageManager", Null)
Dim joPI As JavaObject = joPM.RunMethod("getPackageInfo", Array(packageName, 0))
Dim joAppInfo As JavaObject = joPI.GetField("applicationInfo")
Return joAppInfo.GetField("uid")
End Sub
Sub GetDataUsageForUID(uid As Int, packageName As String) As Map
Dim jo As JavaObject
jo.InitializeContext
Dim nsManager As JavaObject = jo.RunMethod("getSystemService", Array("netstats"))
Dim startTime As Long = DateTime.Now - 24 * DateTime.TicksPerHour
Dim endTime As Long = DateTime.Now
Dim bucket As JavaObject = nsManager.RunMethod("querySummaryForDevice", Array(0, packageName, startTime, endTime))
Dim rxBytes As Long = bucket.RunMethod("getRxBytes", Null)
Dim txBytes As Long = bucket.RunMethod("getTxBytes", Null)
Dim result As Map
result.Initialize
result.Put("rx", rxBytes)
result.Put("tx", txBytes)
Return result
End Sub
However, accessing network data by UID via NetworkStatsManager.queryDetailsForUid() is only possible if:
Your app is pre-installed as a system app or
You have special permissions (not accessible to regular apps)
You are on a rooted device or in advanced developer mode
In short: Android no longer allows regular apps to access other apps' network data via their UID, even if you can technically obtain this UID.
Result :
Error for zed.privatecamera
Error for com.android.providers.userdictionary
Error for com.google.android.apps.carrier.carrierwifi
Error for com.google.android.apps.setupwizard.searchselector
Error for com.android.emergency
Error for com.tinno.productInfo
Error for com.google.android.gms.location.history
Error for com.android.internal.systemui.navbar.gestural
Error for com.google.android.overlay.gmsconfig.personalsafety
Error for com.android.location.fused
Error for com.android.systemui
Error for com.google.android.ondevicepersonalization.services
Error for com.google.android.apps.youtube.music
Error for com.android.bluetoothmidiservice
Error for com.facebook.appmanager
Error for com.mediatek.networkstack.nongooverlay
Error for com.inmobi.weather
Error for com.android.traceur
Error for com.google.android.cellbroadcastreceiver
Error for anywheresoftware.b4a.b4abridge
Error for com.dreamgames.royalmatch
Error for com.vm3.global
Error for com.motorola.overlay.launcher3
Error for com.mediatek.sensorhub.ui
Error for android.auto_generated_rro_product__
Error for com.google.android.apps.adm
Error for com.android.bluetooth
Error for com.android.providers.contacts
Error for com.android.theme.icon.roundedrect
Error for com.motorola.installer
Error for com.maxmpz.audioplayer
Error for com.google.android.photopicker
Error for com.mediatek.gbaservice
Error for com.google.android.inputmethod.latin
Error for com.motorola.android.providers.chromehomepage
Error for com.dti.motorola
Error for com.google.android.apps.restore
Error for com.mediatek.MtkTelephonyServiceResOverlay
...
...
...
Call B4XPages.GetManager.LogEvents = True to enable logging B4XPages events.
** Activity (main) Resume **