Проблема точности данных при получении совокупного использования мобильных данных для всех приложений, использующих NetworkStatsManager - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь создать приложение, которое будет использовать все мобильные данные. В значительной степени это похоже на приложение, которое отображает общее использование мобильных данных, как на странице настроек. Допустим, что на странице настроек мобильное использование говорит, что я использовал 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
    }

Любая помощь или понимание того, почему данные не точные, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...