Desidero conoscere la cronologia di utilizzo dei dati e ho notato il "nuovo" android-6 NetworkStatsManager
che sembra positivo (ho usato TrafficStats
un po 'ma che non coprirà nulla di precedente un riavvio) .Ottenere la cronologia di utilizzo dei dati mobili utilizzando NetworkStatsManager
Dalla documentazione API:
NOTA: Questa API richiede i PACKAGE_USAGE_STATS autorizzazione, che è un permesso a livello di sistema e non sarà concesso per applicazioni di terze parti. Tuttavia, dichiarando che l'autorizzazione implica l'intenzione di utilizzare l'API e l'utente del dispositivo può concedere l'autorizzazione tramite l'applicazione Impostazioni . Alle app del proprietario del profilo viene automaticamente concessa l'autorizzazione per interrogare i dati sul profilo che gestiscono (ovvero, per qualsiasi query eccetto querySummaryForDevice (int, String, long, long)). Allo stesso modo, le applicazioni del proprietario del dispositivo ottengono l'accesso ai dati di utilizzo dell'utente principale.
voglio sapere l'uso di dati a livello aggregato e non giù a quale app che utilizza i dati così ho cercato di usare in questo modo:
NetworkStatsManager service = context.getSystemService(NetworkStatsManager.class);
NetworkStats.Bucket bucket =
service.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, null, from, to);
...
Purtroppo che getta un 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)
...
Il android.permission.READ_NETWORK_USAGE_HISTORY
permesso non è consentito per le applicazioni di terze parti. Quindi questo sembrava un vicolo cieco.
Tuttavia, ho forato giù un po 'nelle parti interne e ho scoperto che è possibile utilizzare l'API interna/nascosta per fare la stessa cosa senza richiedere alcun permesso:
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();
Ho molta voglia di fare lo stesso con l'API pubblica, quindi, come faccio?
Ciao, sto cercando di fare la stessa cosa. Per questa autorizzazione: android.permission.READ_NETWORK_USAGE_HISTORY rimuovo l'avviso su manifest e l'app finalmente installata sul mio dispositivo. Ma quando provo ad ottenere TYPE_MOBILE restituisce sempre 0. WIFI funziona bene. Hai risolto questo problema? per favore fatemelo sapere :) –
anche io mi trovo sempre 0 – aj0822ArpitJoshi