Получение истории использования мобильных данных с помощью NetworkStatsManager

Я хочу знать историю использования данных и заметил "новый" Android-6NetworkStatsManager который кажется положительным (я использовалTrafficStats некоторое время, но это не будет охватывать ничего до перезагрузки).

Из документации API:

ПРИМЕЧАНИЕ. Для этого API требуется разрешение PACKAGE_USAGE_STATS, которое является разрешением системного уровня и не будет предоставляться сторонним приложениям. Однако объявление разрешения подразумевает намерение использовать API, и пользователь устройства может предоставить разрешение через приложение «Настройки». Приложениям-владельцам профилей автоматически предоставляется разрешение запрашивать данные в профиле, которым они управляют (то есть для любого запроса, кроме querySummaryForDevice (int, String, long, long)). Приложения для владельцев устройств также получают доступ к данным об использовании основного пользователя.

Я хочу знать использование данных на агрегированном уровне ине вниз к какому приложению, которое использует данные, поэтому я попытался использовать его так:

NetworkStatsManager service = context.getSystemService(NetworkStatsManager.class);

NetworkStats.Bucket bucket = 
        service.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, from, to);
...

К сожалению, это бросаетSecurityException:

java.lang.SecurityException: NetworkStats: Neither user 10174 nor current process has android.permission.READ_NETWORK_USAGE_HISTORY.
at android.os.Parcel.readException(Parcel.java:1620)
at android.os.Parcel.readException(Parcel.java:1573)
at android.net.INetworkStatsSession$Stub$Proxy.getDeviceSummaryForNetwork(INetworkStatsSession.java:259)
at android.app.usage.NetworkStats.getDeviceSummaryForNetwork(NetworkStats.java:316)
at android.app.usage.NetworkStatsManager.querySummaryForDevice(NetworkStatsManager.java:100)
...

android.permission.READ_NETWORK_USAGE_HISTORY разрешение не разрешено для сторонних приложений. Так что это казалось тупиком.

Однако я немного углубился во внутренности и обнаружил, что вы можете использовать внутренний / скрытый API, чтобы делать то же самое, не запрашивая никаких разрешений:

INetworkStatsService service =
        INetworkStatsService.Stub.asInterface(
                ServiceManager.getService(Context.NETWORK_STATS_SERVICE));

INetworkStatsSession session = service.openSession();

NetworkTemplate mobileTemplate = NetworkTemplate.buildTemplateMobileWildcard();
int fields = NetworkStatsHistory.FIELD_RX_BYTES | NetworkStatsHistory.FIELD_TX_BYTES;

NetworkStatsHistory mobileHistory = session.getHistoryForNetwork(mobileTemplate, fields);

for (int i = 0; i < mobileHistory.size(); i++) {
    NetworkStatsHistory.Entry entry = mobileHistory.getValues(i, null);
    ...
}

session.close();

Я действительно хочу сделать то же самое с публичным API, так как мне это сделать?

Ответы на вопрос(2)

Ваш ответ на вопрос