Я пытаюсь создать приложение, которое будет использовать все мобильные данные. В значительной степени это похоже на приложение, которое отображает общее использование мобильных данных, как на странице настроек. Допустим, что на странице настроек мобильное использование говорит, что я использовал 80 МБ в этом месяце, мое приложение также покажет пользователю, что они используют 80 МБ в этом месяце. Используя QueryDetailsForUid из NetworkStatsManager, я получаю отдельные пакеты и используемые данные, а затем добавляю их в переменную хранения. Однако общее значение, которое я собрал, больше, чем значение, отображаемое на странице настроек. Например, мобильное использование страницы настроек показывает 180 МБ, а моего - 200 МБ.
Моя первая попытка решить эту проблему заключалась в проверке того, что Uid корзины не должен быть приложением определенного типа, но это не помогло. Например, Uid 1000 означает, что это системное приложение, поэтому я удостоверяюсь, что системное приложение не добавлено, но системное приложение также потребляет мобильную передачу данных.
эта функция предназначена для получения системных пакетов:
private fun getNonSystemPackages() {
val pm = packageManager
val packages: List<ApplicationInfo> = pm.getInstalledApplications(PackageManager.GET_META_DATA)
for ( packageInfo : ApplicationInfo in packages) {
val currAppName = packageInfo.packageName
try {
val uid = pm.getPackageUid(currAppName, 0)
values?.add(counter,
ValuesHolder(currAppName, getTotalDataForMobile(uid, subscriberId), uid.toLong())
)
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
}
}
эта функция предназначена для получения индивидуальных мобильных данных из пакета uid:
private fun getTotalDataForMobile(uid: Int, subscriberId: String) : Float {
val networkStatsManager: NetworkStatsManager = applicationContext.getSystemService(Context.NETWORK_STATS_SERVICE) as NetworkStatsManager
var bucket: NetworkStats.Bucket
val networkStats: NetworkStats
var packageData = 0f
if(startTime.toInt() == 0 || endTime.toInt() ==0 ) {
val firstDayOfMonth = Calendar.getInstance()
firstDayOfMonth.set(DAY_OF_MONTH, 1)
val currentTime = Calendar.getInstance()
currentTime.add(Calendar.DATE, 1)
startTime = firstDayOfMonth.timeInMillis
endTime = currentTime.timeInMillis
Log.d("MainActivity", "condition start" + startTime + "end" + endTime )
}
try {
networkStats = networkStatsManager.queryDetailsForUid(
0, //1 is for wifi only, switch to 0 for cellular
subscriberId,
startTime,
endTime,
uid)
} catch (e: RemoteException) {
return 0f
}
do {
bucket = NetworkStats.Bucket()
networkStats.getNextBucket(bucket)
if(bucket.uid != -4 && bucket.uid != -5 ) {
packageData += bucket.rxBytes + bucket.txBytes
Log.d("test","" + packageData)
}else {
return 0f
}
} while (networkStats.hasNextBucket())
return packageData
}
Любая помощь или понимание того, почему данные не точные, спасибо!