2012-01-05 6 views
1

Im пытается измерить, сколько байтов получено моим приложением. Я делаю это так:Android TrafficStats getTotalRxBytes() всегда возвращает нуль

long receivedBytesBefore = TrafficStats.getTotalRxBytes(); 
... 
doSomething(); 
... 
long receivedBytesAfter = TrafficStats.getTotalRxBytes(); 
long receivedBytes = receivedBytesAfter - receivedBytesBefore; 

Моя проблема заключается в том, что getTotalRxBytes() всегда возвращает 0. Таким образом, мой результат не 0, независимо от того, что я делаю. я узнал, что этот метод просто читать некоторые TextFiles как

/sys/class/net/rmnet0/statistics/rx_bytes 

Так что я смотрел в эти файлы и все они содержат только «0».

Пропустить что-то или мне нужно как-то активировать эту функцию? Есть ли другой способ измерить, сколько байтов получено моим приложением?

Мой Android устройство является Samsung Galaxy Ace S5830 работает Android 2.3.3

ответ

-1

Они могут не поддерживаться на устройстве, и может вернуться UNSUPPORTED, который может быть равен 0.

+2

Если это не поддерживается, функция действительно вернет UNSUPPORTED. Но в документации указано, что это -1, а не 0. Проблема может заключаться в том, что мое устройство просто не обновляет соответствующие текстовые файлы, поэтому они всегда остаются 0. Есть ли другой способ достижения функциональности getTotalRxBytes? – Orangenlimo

2

я могу проверить это было со мной тоже.

Из поведения, которое я наблюдал, кажется, что getTotalRxBytes работает только при подключении Wi-Fi. Но что-то, о чем нужно знать, это то, что если вы пытаетесь получить точное количество байтов, полученных для файла, например, швы должны быть добавлены в несколько лишних байтов.

Так что, если вам не нужно, чтобы он был точным. Вы можете использовать getMobileRxBytes(), когда wifi не активен и getTotalRxBytes(), когда Wi-Fi активен.

Вот простой пример.

т.е.

ConnectivityManager connManager; 
    connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
    mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    mMobile = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    long initialBytes = 0; 
    long finalBytes = 0; 
    long byteDifference = 0; 
    boolean onWifi= false; 

    if (mWifi.isConnected()) 
    { 
    //wifi connected 
    initialBytes = TrafficStats.getTotalRxBytes(); 
    onWifi = true; 
    } 
    else if (mMobile.isConnected()) 
    { 
    //if 3g/4g connected 
    initialBytes = TrafficStats.getMobileRxBytes(); 
    onWifi = true; 
    } 
    else 
    { 
    //Something funny going on 
    Log.e("Error", "Something funny going on"); 
    return; 
    } 


// Process whatever you want to process 


    if(onWifi) 
    { 
     finalBytes = TrafficStats.getTotalRxBytes(); 
    } 
    else 
    { 
     finalBytes = TrafficStats.getMobileRxBytes(); 
    } 

    byteDifference = finalBytes - initialBytes; 

Что-то вдоль этих линий. Надеюсь, это поможет.

+0

Спасибо за ответ, но это не решает мою проблему. Я все еще получаю только 0. Я протестировал код, который был опубликован в моем вопросе на другом телефоне (Nexus One), и он работал нормально. Я думаю, проблема в том, что мое устройство просто несовместимо. – Orangenlimo