2016-12-21 1 views
0

Mit TrafficStats habe ich die Nutzung der youtube App Daten überprüft. In einigen Geräten funktioniert es gut, aber nicht mit vielen anderen Geräten. Ich habe festgestellt, dass diese Statistiken auf der Entwickler-Website möglicherweise nicht auf allen Plattformen verfügbar sind. Wenn die Statistiken von diesem Gerät nicht unterstützt werden, wird UNSUPPORTED zurückgegeben.Youtube Nutzungsberechnung mit TrafficStats

Also in diesen Fällen, wie kann ich die Geräte-App-Nutzung bekommen?

Ich verwendete TrafficStats.getUidRxBytes (packageInfo.uid) + TrafficStats.getUidTxBytes (packageInfo.uid);

Dies gibt -1 jedes Mal zurück.

Antwort

0

Wir können NetworkStats verwenden. https://developer.android.com/reference/android/app/usage/NetworkStats.html Bitte beachten Sie ein Beispiel Repo, die ich den Hinweis bekommen habe. https://github.com/RobertZagorski/NetworkStats Wir können eine ähnliche stackoverflow Frage auch sehen. Getting mobile data usage history using NetworkStatsManager

Dann musste ich diese Logik für einige bestimmte Geräte ändern. In diesen Geräten gibt die normale Methode keine korrekten Nutzungswerte zurück. Also ich modifizierte ist wie

/* bekommen youtube Nutzung sowohl für mobile und 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 ""; 
    } 
Verwandte Themen