Ответ 1
Использование NetworkStats
не является сложным.
Уровень API-устройства должен быть не менее 23. Ниже приведены некоторые шаги, необходимые для начала использования NetworkStatsManager
-
Объявите необходимые разрешения в
AndroidManifest.xml
:<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>
-
Запросить разрешение в
Activity
android.permission.PACKAGE_USAGE_STATS
не является нормальным разрешением, поэтому его нельзя просто запросить. Чтобы проверить, предоставлено ли разрешение, отметьте:AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), getPackageName()); if (mode == AppOpsManager.MODE_ALLOWED) { return true; }
Чтобы запросить это разрешение, просто вызовите
Intent
:Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); startActivity(intent);
Также необходим другой допуск:
Manifest.permission.READ_PHONE_STATE
. Однако это нормальное разрешение, поэтому может быть запрошено как любое другое разрешение -
Используйте
NetworkStatsManager
:Чтобы получить ссылку, вызовите:
NetworkStatsManager networkStatsManager = (NetworkStatsManager) getApplicationContext().getSystemService(Context.NETWORK_STATS_SERVICE);
Все, что извлекается из
NetworkStatsManager
, упаковано вBuckets
. Это просто POJO, который содержит данные.GLOBAL:
Чтобы получить общее использование WiFi:
NetworkStats.Bucket bucket; try { bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, "", 0, System.currentTimeMillis()); } catch (RemoteException e) { return -1; }
из
NetworkStats.Bucket
, можно вызвать два метода для использования (в Bps):bucket.getRxBytes(); bucket.getTxBytes();
Получение данных для мобильной сети сложнее. Чтобы получить вызов
Bucket
:public long getAllRxBytesMobile(Context context) { NetworkStats.Bucket bucket; try { bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, getSubscriberId(context, ConnectivityManager.TYPE_MOBILE), 0, System.currentTimeMillis()); } catch (RemoteException e) { return -1; } return bucket.getRxBytes(); } //Here Manifest.permission.READ_PHONE_STATS is needed private String getSubscriberId(Context context, int networkType) { if (ConnectivityManager.TYPE_MOBILE == networkType) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); return tm.getSubscriberId(); } return ""; }
Применение:
Для получения данных для конкретного приложения прочитайте документацию для queryDetailsForUID.
Чтобы получить использование пакета для WiFi:
NetworkStats networkStats = null; try { networkStats = networkStatsManager.queryDetailsForUid( ConnectivityManager.TYPE_WIFI, "", 0, System.currentTimeMillis(), packageUid); } catch (RemoteException e) { return -1; } NetworkStats.Bucket bucket = new NetworkStats.Bucket(); networkStats.getNextBucket(bucket);
Чтобы получить использование пакета для Мобильный:
Unfortunalety NetworkStats networkStats = null; try { networkStats = networkStatsManager.queryDetailsForUid( ConnectivityManager.TYPE_MOBILE, getSubscriberId(context, ConnectivityManager.TYPE_MOBILE), 0, System.currentTimeMillis(), packageUid); } catch (RemoteException e) { return -1; } NetworkStats.Bucket bucket = new NetworkStats.Bucket(); networkStats.getNextBucket(bucket);
Несчастье, согласно эта часть кода, получение статистики возможно только для
ConnectivityManager.TYPE_MOBILE
иConnectivityManager.TYPE_WIFI
.
Сделано образец Github repo, демонстрирующий использование.