2016-12-21 1 views
0

En utilisant TrafficStats, je vérifiais l'utilisation des données de l'application youtube. Sur certains appareils, cela fonctionne bien, mais pas avec beaucoup d'autres appareils. J'ai trouvé que sur le site du développeur, il se peut que ces statistiques ne soient pas disponibles sur toutes les plateformes. Si les statistiques ne sont pas prises en charge par cet appareil, UNSUPPORTED sera renvoyé.Calcul de l'utilisation de Youtube en utilisant TrafficStats

Dans ce cas, comment puis-je utiliser l'application de l'appareil? J'utilisais TrafficStats.getUidRxBytes (packageInfo.uid) + TrafficStats.getUidTxBytes (packageInfo.uid);

cela revient à -1 à chaque fois.

Répondre

0

Nous pouvons utiliser NetworkStats. https://developer.android.com/reference/android/app/usage/NetworkStats.html S'il vous plaît voir un exemple de pension dont j'ai eu la moindre idée. https://github.com/RobertZagorski/NetworkStats Nous pouvons également voir une question de stackoverflow similaire. Getting mobile data usage history using NetworkStatsManager

Puis j'ai dû modifier cette logique pour certains périphériques particuliers. Dans ces appareils, la méthode normale ne renvoie pas les valeurs d'utilisation correctes. Donc j'ai modifié est

/* obtenir l'utilisation de youtube à la fois pour mobile et wifi. */

public long getYoutubeTotalusage(Context context) { 
      String subId = getSubscriberId(context, ConnectivityManager.TYPE_MOBILE); 

//both mobile and wifi usage is calculating. For mobile usage we need subscriberid. For wifi we can give it as empty string value. 
      return getYoutubeUsage(ConnectivityManager.TYPE_MOBILE, subId) + getYoutubeUsage(ConnectivityManager.TYPE_WIFI, ""); 
     } 


private long getYoutubeUsage(int networkType, String subScriberId) { 
     NetworkStats networkStatsByApp; 
     long currentYoutubeUsage = 0L; 
     try { 
      networkStatsByApp = networkStatsManager.querySummary(networkType, subScriberId, 0, System.currentTimeMillis()); 
      do { 
       NetworkStats.Bucket bucket = new NetworkStats.Bucket(); 
       networkStatsByApp.getNextBucket(bucket); 
       if (bucket.getUid() == packageUid) { 
        //rajeesh : in some devices this is immediately looping twice and the second iteration is returning correct value. So result returning is moved to the end. 
        currentYoutubeUsage = (bucket.getRxBytes() + bucket.getTxBytes()); 
       } 
      } while (networkStatsByApp.hasNextBucket()); 

     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 

     return currentYoutubeUsage; 
    } 


    private String getSubscriberId(Context context, int networkType) { 
     if (ConnectivityManager.TYPE_MOBILE == networkType) { 
      TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
      return tm.getSubscriberId(); 
     } 
     return ""; 
    }