Статистика андроида 3g трафика для каждого APP, как?
Для статистического сетевого трафика на APP то, что я сейчас использую, Android TrafficStats
Чтобы я мог получить результат, как показано ниже:
- Youtube 50.30 MBytes
- Facebook 21.39 MBytes
- Google Play 103.38 MBytes
- (и многое другое...)
Как я знаю, "Android Trafficstats" - это только собственный указатель на c файл. (может быть .so?)
Но он смешивает Wifi и 3g-трафик, есть ли способ получить статистику трафика без Wi-Fi?
Ответы
Ответ 1
Вечером все, у меня есть способ сделать это...
Сначала мне нужно создать класс, который расширяет BroadcasrReceiver, например:
Определение манифеста:
<receiver android:name=".core.CoreReceiver" android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
Коды:
/**
* @author me
*/
public class CoreReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (Constants.phone == null) {
// Receive [network] event
Constants.phone=new PhoneListen(context);
TelephonyManager telephony=(TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(Constants.phone, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
}
WifiManager wifi=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
boolean b=wifi.isWifiEnabled();
if (Constants.STATUS_WIFI != b) {
// WiFi status changed...
}
}
}
И прослушиватель статистики по телефону ниже...
public class PhoneListen extends PhoneStateListener {
private Context context;
public PhoneListen(Context c) {
context=c;
}
@Override
public void onDataConnectionStateChanged(int state) {
switch(state) {
case TelephonyManager.DATA_DISCONNECTED:// 3G
//3G has been turned OFF
break;
case TelephonyManager.DATA_CONNECTING:// 3G
//3G is connecting
break;
case TelephonyManager.DATA_CONNECTED:// 3G
//3G has turned ON
break;
}
}
}
Наконец, здесь моя логика
- Соберите счет в SQLite DB.
- Собрать все сети приложений через TrafficStats каждые 1 минуту, только когда 3G включен.
- Если 3G выключен, прекратите сбор.
- Если оба 3G и WiFi включены, прекратите сбор.
Как я знаю, сетевой трафик будет проходить только через WiFi, если доступны 3G и WiFi.
Ответ 2
После долгой борьбы я могу найти решение для получения данных по любому интерфейсу для каждого установленного приложения в android
устройство.
Поскольку Android предоставляет TrafficStats Apis, но эти API предоставляют компиляцию статистики данных для каждого приложения с момента загрузки устройства и даже
API не поддерживают получение данных по любому интерфейсу для конкретного приложения.
Даже если мы полагаемся на TraffiucStates APIS, мы получаем новую статистику данных для каждого приложения.
Поэтому я решил использовать скрытые API-интерфейсы, чтобы использовать это.
Здесь я упоминаю шаги, чтобы получить статистику данных для каждого приложения через любой интерфейс в Android...
-
Установите сеанс "INetworkStatsSession"
import android.net.INetworkStatsSession;
INetworkStatsSession mStatsSession = mStatsService.openSession();
-
Создайте сетевой шаблон в соответствии с интерфейсом, который вы хотите измерить.
import static android.net.NetworkTemplate.buildTemplateEthernet;
import static android.net.NetworkTemplate.buildTemplateMobile3gLower;
import static android.net.NetworkTemplate.buildTemplateMobile4g;
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
import android.net.NetworkTemplate;
private NetworkTemplate mTemplate;
mTemplate = buildTemplateMobileAll(getActiveSubscriberId(this
.getApplicationContext()));
-
GetActive SubscriberID:
private static String getActiveSubscriberId(Context context) {
final TelephonyManager tele = TelephonyManager.from(context);
final String actualSubscriberId = tele.getSubscriberId();
return SystemProperties.get(TEST_SUBSCRIBER_PROP, actualSubscriberId);
}
-
Соберите сеть HIStory соответствующего приложения byt, передавая UID приложений...
private NetworkStatsHistory collectHistoryForUid(NetworkTemplate template,
int uid, int set) throws RemoteException {
final NetworkStatsHistory history = mStatsSession.getHistoryForUid(
template, uid, set, TAG_NONE, FIELD_RX_BYTES | FIELD_TX_BYTES);
return history;
}
-
Получить общие данные о потреблении:
public void showConsuption(int UID){
NetworkStatsHistory history = collectHistoryForUid(mTemplate, UID,
SET_DEFAULT);
Log.i(DEBUG_TAG, "load:::::SET_DEFAULT:.getTotalBytes:"+ Formatter.formatFileSize(context, history.getTotalBytes()));
history = collectHistoryForUid(mTemplate, 10093,
SET_FOREGROUND);
Log.i(DEBUG_TAG, "load::::SET_FOREGROUND::.getTotalBytes:"+ Formatter.formatFileSize(context, history.getTotalBytes()));
history = collectHistoryForUid(mTemplate, 10093,
SET_ALL);
Log.i(DEBUG_TAG, "load::::SET_ALL::.getTotalBytes:"+ Formatter.formatFileSize(context, history.getTotalBytes()));
}
Ответ 3
Я нашел способ получить только wifi-трафик
long totalbyte = Trafficstats.getTotalRxBytes();
long mobilenetworkbyte = Trafficstats.getMobileRxBytes();
String total = Long.toString(totalbyte);
String mobile = Long.toString(mobilenetworkbyte);
String wifibyte = total - mobile + "kb";
теперь wifibyte string show wifi общий байт
его работа для меня, я надеюсь, что работа для вас
Ответ 4
Попробуйте использовать следующий код и отключите свой "WIFI" и проверьте только "3G"
-
Создайте новый проект Android в Eclipse. Не забудьте использовать класс TrafficStats, для которого вы должны настроить API для Android 2.2 (Froyo) или выше.
-
В папке /res/layout мы создадим ресурс main.xml. Для этого проекта мы просто используем серию текстовых представлений в вертикально уложенной линейной компоновке.
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textStyle="bold"
android:gravity="center"
android:paddingBottom="20dip"
android:text="Traffic Stats Demo" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textColor="#00ff00"
android:gravity="center"
android:text="Transmit Bytes" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:gravity="center"
android:text="0"
android:id="@+id/TX"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textColor="#ff0000"
android:gravity="center"
android:text="Receive Bytes" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:gravity="center"
android:text="0"
android:id="@+id/RX"/>
</LinearLayout>
-
С нашей компоновкой мы можем перейти в папку /src. Создайте Main.java, расширив класс Activity. Давайте также продолжим и объявим три переменные частного класса.
Main.java
package com.authorwjf;
import android.app.Activity;
import android.app.AlertDialog;
import android.net.TrafficStats;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
public class Main extends Activity {
private Handler mHandler = new Handler();
private long mStartRX = 0;
private long mStartTX = 0;
}
-
Мы будем использовать переопределение ввода для инициализации наших частных переменных, а также запланировать обратный вызов в потоке пользовательского интерфейса. Запомните проверку для перечисления TrafficStats.UNSUPPORTED. Хотя мой опыт работы с классом TrafficStats прошел без сбоев, официальная документация Google заявляет, что некоторые устройства могут не поддерживать этот тип отчетов, и когда это происходит, вызов возвращает вышеупомянутое значение. По этой причине неплохо написать свой код в обороне, как показал здесь Ive.
Main.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mStartRX = TrafficStats.getTotalRxBytes();
mStartTX = TrafficStats.getTotalTxBytes();
if (mStartRX == TrafficStats.UNSUPPORTED || mStartTX == TrafficStats.UNSUPPORTED) {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Uh Oh!");
alert.setMessage("Your device does not support traffic stat monitoring.");
alert.show();
} else {
mHandler.postDelayed(mRunnable, 1000);
}
}
-
И последнее, но не менее важное: нам нужно обновить наш дисплей и перенести его.
Main.java
private final Runnable mRunnable = new Runnable() {
public void run() {
TextView RX = (TextView)findViewById(R.id.RX);
TextView TX = (TextView)findViewById(R.id.TX);
long rxBytes = TrafficStats.getTotalRxBytes()- mStartRX;
RX.setText(Long.toString(rxBytes));
long txBytes = TrafficStats.getTotalTxBytes()- mStartTX;
TX.setText(Long.toString(txBytes));
mHandler.postDelayed(mRunnable, 1000);
}
};