44

アプリケーションごとに Android でのデータ使用量を調べようとしています。Android データ使用アプリやクォータ / キャップ モニター ウィジェットのようなもの: データの追加料金が発生したり、再び上限が設定されたりすることはありません! .

Stack Overflow の質問How to go aboutdetect data usage in Android environmentを見ました。

しかし、それはあまり役に立ちませんでした。


ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo( mInfo );
List<RunningAppProcessInfo> listOfRunningProcess = activityManager.getRunningAppProcesses();
Log.d(TAG, "XXSize: " + listOfRunningProcess.size());

for (RunningAppProcessInfo runningAppProcessInfo : listOfRunningProcess) {

    if (runningAppProcessInfo.uid > 1026)
    {
        Log.d(TAG, "ANS " + runningAppProcessInfo.processName +
                   " Id :" + runningAppProcessInfo.pid +
                   " UID: " + runningAppProcessInfo.uid);
    }
}

Akos Cz の提案に従って、上記のコードを試しました。ただし、上記とは異なり、すべてのUIDは数字です。app_79これでよろしいですか?

4

7 に答える 7

44

次のリンクは、アプリケーションごとのデータ使用量をプログラムで決定する方法を理解するのに役立ちます。

TraficStats APIを使用し、UID(アプリケーション)ごとに送受信されたバイト数を追跡​​するには、コードを実装する必要があります。

于 2012-08-13T18:31:27.687 に答える
10

このメソッドは、新しいクラス PackageInformationTotal を作成した後に使用します。

public void getPakagesInfoUsingHashMap() {
    final PackageManager pm = getPackageManager();
    // get a list of installed apps.
    List<ApplicationInfo> packages = pm.getInstalledApplications(0);

    // loop through the list of installed packages and see if the selected
    // app is in the list
    for (ApplicationInfo packageInfo : packages) {
        // get the UID for the selected app
        UID = packageInfo.uid;
        String package_name = packageInfo.packageName;
        ApplicationInfo app = null;
        try {
            app = pm.getApplicationInfo(package_name, 0);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String name = (String) pm.getApplicationLabel(app);
        Drawable icon = pm.getApplicationIcon(app);
        // internet usage for particular app(sent and received)
        double received = (double) TrafficStats.getUidRxBytes(UID)

                / (1024 * 1024);
        double send = (double) TrafficStats.getUidTxBytes(UID)
                / (1024 * 1024);
        double total = received + send;

        if(total>0)
        {
            PackageInformationTotal pi=new PackageInformationTotal();
            pi.name=name;
            pi.packageName=package_name;
            pi.icon=icon;               
            pi.totalMB=String.format( "%.2f", total )+" MB";
            pi.individual_mb=String.format( "%.2f", total );
            totalData+=Double.parseDouble(String.format( "%.2f", total ));
            dataHash.add(pi);
        Log.e(name,String.format( "%.2f", total )+" MB");
        }

    }
    Editor edit=shared.edit();
    edit.putString("Total",String.format( "%.2f", totalData));
    edit.commit();
}

その後、すべてのプロセスの使用状況を MB 単位で追跡できます。

于 2014-03-21T13:44:30.200 に答える
1

プログラム的に:

アクションのインテント フィルタACTION_MANAGE_NETWORK_USAGE(Android 4.0 で導入) を宣言して、アプリケーションがデータ使用を制御するオプションを提供するアクティビティを定義していることを示すことができます。ACTION_MANAGE_NETWORK_USAGE特定のアプリケーションのネットワーク データ使用を管理するための設定を示します。ユーザーがネットワークの使用を制御できるようにする設定アクティビティがアプリにある場合、そのアクティビティに対してこのインテント フィルタを宣言する必要があります。アプリケーションごとのデータ使用量の管理の詳細については、こちらをご覧ください。

の適切な定義は、ここでACTION_MANAGE_NETWORK_USAGE確認できます。

于 2012-08-13T18:34:09.387 に答える