2010-02-16 21 views
2

Une application Android que j'écris implique beaucoup de téléchargement de contenu (pensez à podcatcher/RSS). Je voudrais être en mesure de donner à l'utilisateur une indication du nombre d'octets qu'ils ont téléchargés, afin qu'ils puissent décider s'ils veulent ou non utiliser Wifi.Sur Android/Java, combien d'octets une connexion a-t-elle téléchargée?

A cette fin, j'ai trouvé un moyen de compter le nombre d'octets lu par l'application, en enveloppant un InputStream dans un CountingInputStream simple. Cependant, cela ne prend pas en compte les éléments de base comme les en-têtes de paquets et les en-têtes HTTP. Plus important encore, il ne prend en compte aucune compression avec laquelle le contenu peut être encodé.

Alors, combien d'octets mon application a-t-elle téléchargé sur le réseau? Je ne suis pas si intéressé par le nombre d'octets téléchargés, mais si vous savez comment, ne soyez pas timide.

J'ai adopté une approche de niveau relativement bas car j'alimente le flux d'entrée dans un PullParser XML. Je vais aussi avoir besoin de faire un exercice similaire avec des octets de dumping (images dans ce cas) directement sur la carte SD.

Est-ce la meilleure approche? Qu'est-ce que je rate?

Répondre

1

ufff ... Je pense que c'est assez transparent au protocole sous-jacent, donc vous ne pouvez pas compter tous ces octets utilisés dans la couche session ou liaison, et les opérateurs aiment charger même les octets de contrôle qui ne sont pas visibles à l'utilisateur final. En outre, ils comptent le trafic dans les deux directions (votre demande au serveur en prend aussi), donc - bonne question est: comment mesurer le trafic nécessaire/argent pour télécharger cette image ...?

+0

Bons points concernant les octets de contrôle et l'argent. – jamesh

1

Ceci n'est pas une réponse directe, mais vous pouvez essayer de demander à quelqu'un qui a déjà résolu un problème similaire, par exemple. une application de compteur de données. J'ai utilisé NetCounter de Cyril Jaquier (http://www.jaqpot.net/netcounter/), et il prétend que son logiciel est open source. Je n'ai pas réussi à faire fonctionner son lien de téléchargement, mais il y a une adresse e-mail de contact. Si vous avez son code source, vous devriez pouvoir utiliser la même méthode que lui.

+0

Ceci utilise/sys/class/net/$ {interface}/statistics/rx_bytes qui est: system wide (j'ai besoin d'une application spécifique); et spécifique à la plate-forme - il y a des problèmes de portage que l'application que vous citez a dû contourner. Dans l'ensemble, une bonne suggestion, mais probablement une couche trop faible pour mes fins. Merci. – jamesh

1

Comme je sais, il existe deux façons de compter le trafic de données. L'un est/sys/class/net/{interface}/statistiques comme mentionné dans l'application Android nommé netCounter, l'autre est/proc/net/dev qui est utilisé dans l'application Android nommé wifi-tether. Mais je ne connais pas la différence entre ces deux méthodes, ni ce qui est mieux.

0

Le nombre d'octets reçus par une application particulière est stocké dans/proc/uid_stat // tcp_rcv où app_uid correspond à l'uid de votre application sur le périphérique concerné.

+0

Merci. Va certainement vérifier cela. – jamesh