2016-05-12 10 views
9

Vorrei soddisfare i dispositivi in ​​esecuzione nella versione jelly bean e di seguito, nonché le versioni sopra Jelly Bean.Catering per dispositivi che eseguono Jelly bean e versioni successive a Jelly bean quando si ottiene l'utilizzo dei dati dell'applicazione

Il mio metodo dovrebbe ottenere l'utilizzo dell'app/traffico per tutte le applicazioni in base all'ID dell'applicazione. Si prega di prendere nota di questa riga rx = Long.parseLong(String.valueOf(id)); sulla prima clausola if che soddisfa i dispositivi che eseguono versioni inferiori o uguali a Jelly Bean.

L'utilizzo di dati di un'applicazione installata in base al suo ID è ottenuta utilizzando utilizzando TrafficStats.getUidTxBytes(uid) ma che restituisce solo un valore di 0 a 4.3 Tuttavia, la clausola altro utilizzando TrafficStats.getUidTxBytes(uid) recupera utilizzo app per app precisione nelle versioni precedenti 5.

sono particolarmente preoccupato per la se clausola che soddisfa dispositivo che esegue la versione android inferiore 5 per esempio in questo caso 4.3 (Jelly Bean)

public void recordSnapshot(Context context) 
{ 
    TinyDB settings = new TinyDB(context); 
    int boot_id = settings.getInt(AppPreferences.BOOT_ID); 
    PackageManager pm = context.getPackageManager(); 

    for (ApplicationInfo app : pm.getInstalledApplications(0)) 
    { 
    String androidOS = Build.VERSION.RELEASE; 
    int currentapiVersion = android.os.Build.VERSION.SDK_INT; 

    long tx = 0; 
    long rx = 0; 
    int uid = app.uid; 

    if(currentapiVersion <= Build.VERSION_CODES.JELLY_BEAN) 
    { 
     File dir = new File("/proc/uid_stat/"); 
     String[] children = dir.list(); 
     List<Integer> uids = new ArrayList<Integer>(); 

      for (int i = 0; i < children.length; i++) { 
       uid = Integer.parseInt(children[i]); 
       String uidString = String.valueOf(uid); 
       File uidFileDir = new File("/proc/uid_stat/" + uidString); 
       File uidActualFile = new File(uidFileDir, "tcp_rcv"); 
       StringBuilder text = new StringBuilder(); 

       try { 
       BufferedReader br = new BufferedReader(new FileReader(uidActualFile)); 
       String line; 

       while ((line = br.readLine()) != null) { 
        Log.d(String.valueOf(uid), line);//this returns the amount of data received for the particular uid 
        rx = Long.parseLong(String.valueOf(uid)); 
        text.append(line); 

        text.append('\n'); 
       } 
       } catch (IOException e) { 
       //handle this 
       } 

       uids.add(id); 
      } 
    } 
    else { 
     tx = TrafficStats.getUidTxBytes(uid); 
     rx = TrafficStats.getUidRxBytes(uid); 
    } 
} 

intero metodo

public void recordSnapshot(Context context) 
    { 
     TinyDB settings = new TinyDB(context); 
     int boot_id = settings.getInt(AppPreferences.BOOT_ID); 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo info = cm.getActiveNetworkInfo(); 
     int networkType = NetworkState.GetNetworkState(context, info, "DataUsageRecorder"); // wifi, data, data roaming 

     // Get all apps 
     PackageManager pm = context.getPackageManager(); 
     for (ApplicationInfo app : pm.getInstalledApplications(0)) 
     { 

      String androidOS = Build.VERSION.RELEASE; 
      int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
      long tx = 0; 
      long rx = 0; 
      int uid = app.uid; 


      if(currentapiVersion <= Build.VERSION_CODES.JELLY_BEAN_MR2) 
      { 

       File dir = new File("/proc/uid_stat/"); 
       String[] children = dir.list(); 
       List<Integer> uids = new ArrayList<Integer>(); 

       for (int i = 0; i < children.length; i++) { 
        uid = Integer.parseInt(children[i]); 
        String uidString = String.valueOf(uid); 
        File uidFileDir = new File("/proc/uid_stat/" + uidString); 
        File uidActualFile = new File(uidFileDir, "tcp_rcv"); 
        StringBuilder text = new StringBuilder(); 

        try { 
         BufferedReader br = new BufferedReader(new FileReader(uidActualFile)); 
         String line; 

         while ((line = br.readLine()) != null) { 
          Log.d(String.valueOf(uid), line);//this returns the amount of data received for the particular uid 
          rx = Long.parseLong(String.valueOf(uid)); 
          //text.append(line); 

          //text.append('\n'); 
         } 
        } catch (IOException e) { 
         //handle this 
        } 

        uids.add(uid); 
       } 
      } 

       else 
      { 

       tx = TrafficStats.getUidTxBytes(uid); 
       rx = TrafficStats.getUidRxBytes(uid); 
      } 




      if ((tx == 0 || rx == 0)) 
      { 
       // Skip inactive items 
       continue; 
      } 
      else if (Globals.DEBUG && (tx < DEBUG_5MB && rx < DEBUG_5MB)) { 
       // Let's skip all the BS for quick testing 
       continue; 
      } 


      // Get package name 
      String package_name; 
      try { 
       CharSequence name = pm.getApplicationLabel(app); 
       package_name = name != null ? name.toString() : ""; 
      } catch (Exception e) { 
       e.printStackTrace(); 
       package_name = ""; 
      } 

      AppUsage totals; 
      AppUsage appUsage; 

      // Get current data entry for app 
      //appUsage = appUsageDao.queryBuilder().where(AppUsageDao.Properties.App_uid.eq(uid), AppUsageDao.Properties.Type.eq(networkType), AppUsageDao.Properties.Boot_id.eq(boot_id)).limit(1).unique(); 

      // Get last recorded totals since device boot 
      totals = appUsageDao.queryBuilder().where(AppUsageDao.Properties.App_uid.eq(uid), AppUsageDao.Properties.Type.eq(NetworkState.ALL), AppUsageDao.Properties.Boot_id.eq(boot_id)).limit(1).unique(); 

      long tx_diff = tx; 
      long rx_diff = rx; 

      if (totals != null) 
      { 
       // Get difference, and update 
       tx_diff -= totals.getTx(); 
       rx_diff -= totals.getRx(); 

       totals.setTx(tx); 
       totals.setRx(rx); 
      } 
      else 
      { 
       // add new master 
       totals = new AppUsage(null, new Date(), uid, package_name, NetworkState.ALL, tx_diff, rx_diff, 0, 0, boot_id); 
      } 

      // add new app 
      appUsage = new AppUsage(null, new Date(), uid, package_name, networkType, tx_diff, rx_diff, 0, 0, boot_id); 


     /*if (appUsage == null) 
     { 
      // Create new 
      appUsage = new AppUsage(null, new Date(), uid, package_name, networkType, tx, rx, 0, 0, boot_id); 
     } 
     else 
     { 
      // Update 
      appUsage.setTx(tx); 
      appUsage.setRx(rx); 
     }*/ 

      try { 
       // master 
       appUsageDao.insertOrReplace(totals); 
      } catch (DaoException e) { 
       e.printStackTrace(); 
      } 

      try { 
       appUsageDao.insertOrReplace(appUsage); 
      } catch (DaoException e) { 
       e.printStackTrace(); 
      } 

      //apps.put(app.uid, new DataUsageItem(app.uid, app.packageName, pm.getApplicationLabel(app).toString())); 
     } 
    } 
+0

Che cosa è la questione? La tua clausola if fornisce la risposta sbagliata? Crolla? Cosa vuoi sapere? – Entreco

risposta

1

nonostante quello che dice la documentazione statistiche di traffico doesnt sembrano funzionare bene su 4.3, nel senso che in alcuni casi funziona per qualche app id e non per un po ', quindi vorrei bypassare l'intero trafficstats di classe e di creare due metodi personalizzati che punta al file c nativo che contiene dati di utilizzo dell'app per recuperare TX (trasmissione dati) e Rx (dati ricevuti) all'interno della stessa classe

long tx = yourClass.getUidTxBytes(uid); 
    long rx = yourClass.getUidRxBytes(uid); 

Poi per RX

public static Long getUidRxBytes(int uid) { 
     BufferedReader reader; 
     Long rxBytes = 0L; 
     try { 
      reader = new BufferedReader(new FileReader("/proc/uid_stat/" + uid 
        + "/tcp_rcv")); 
      rxBytes = Long.parseLong(reader.readLine()); 
      reader.close(); 
     } 
     catch (FileNotFoundException e) { 
      rxBytes = TrafficStats.getUidRxBytes(uid); 
      //e.printStackTrace(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return rxBytes; 
    }** 

Poi per TX

public static Long getUidTxBytes(int uid) { 
     BufferedReader reader; 
     Long txBytes = 0L; 
     try { 
      reader = new BufferedReader(new FileReader("/proc/uid_stat/" + uid 
        + "/tcp_snd")); 
      txBytes = Long.parseLong(reader.readLine()); 
      reader.close(); 
     } 
     catch (FileNotFoundException e) { 
      txBytes = TrafficStats.getUidTxBytes(uid); 
      //e.printStackTrace(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return txBytes; 
    } 
+0

Grazie ci proverò più tardi oggi – Zidane

Problemi correlati