2

モバイルおよびwifiインターフェースを介したアプリごとのデータ使用レポートを必要とするデータマネージャーアプリを構築しています。

「NetworkStatsManager.querySummary」メソッドを使用しようとすると、すべてではなく一部の UID の使用状況レポートしか取得できません。メソッドのAPIドキュメントには記載されていますが

呼び出し元のユーザーに属する uid のみを含むようにフィルター処理された結果

どのUIDが呼び出し元のユーザーに属し、どれが属していないかはわかりません。違いと、この新しい「NetworkStatsManager」クラスを使用してすべての UID のデータ使用レポートを取得する方法を理解してください。

4

2 に答える 2

1

デバイスの概要を取得できます。別の方法を使用してください: android.app.usage.NetworkStatsManager#querySummaryForDevice. 使用例は次のとおりです。

Wi-Fi:

NetworkStats.Bucket bucket;
try {
    bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI,
            "",
            0,
            System.currentTimeMillis());
} catch (RemoteException e) {
    return -1;
}

モバイル:

public long getAllTxBytesMobile(Context context) {
    NetworkStats.Bucket bucket;
    try {
        bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE,
                getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
                0,
                System.currentTimeMillis());
    } catch (RemoteException e) {
        return -1;
    }
    return bucket.getTxBytes();
}

private String getSubscriberId(Context context, int networkType) {
    if (ConnectivityManager.TYPE_MOBILE == networkType) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getSubscriberId();
    }
    return "";
}

Rx または Tx バイトを取得するには、次のように呼び出します。

bucket.getRxBytes();
bucket.getTxBytes();

使用方法を示すサンプルGithub リポジトリを作成しました。

于 2016-09-09T13:08:26.943 に答える
1

質問は、各アプリのデータ使用量を尋ねるようなものです。デバイス全体の使用量ではありません。したがって、各 uid に関して、対応するアプリのデータ使用量が必要です。以下は、特定の uid のデータ使用量を取得するために使用されます。これもすべてのデバイスで機能するわけではありません。確認したところ、一部のデバイスでは、アプリの使用状況の追跡を許可した後でも、これを利用できないことがわかりました. ただし、これはシステム レベルの権限です。

long dataUsageWithRespectToUid = getPackageRxBytesMobile(this)+ getPackageTxBytesMobile(this) + getPackageRxBytesWifi() +getPackageTxBytesWifi();

public long getPackageRxBytesMobile(Context context) {
    NetworkStats networkStats = null;
    try {
        networkStats = networkStatsManager.queryDetailsForUid(
                ConnectivityManager.TYPE_MOBILE,
                getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
                0,
                System.currentTimeMillis(),
                packageUid);
    } catch (RemoteException e) {
        return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);
    networkStats.getNextBucket(bucket);
    return bucket.getRxBytes();
}

public long getPackageTxBytesMobile(Context context) {
    NetworkStats networkStats = null;
    try {
        networkStats = networkStatsManager.queryDetailsForUid(
                ConnectivityManager.TYPE_MOBILE,
                getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
                0,
                System.currentTimeMillis(),
                packageUid);
    } catch (RemoteException e) {
        return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);
    return bucket.getTxBytes();
}

public long getPackageRxBytesWifi() {
    NetworkStats networkStats = null;
    try {
        networkStats = networkStatsManager.queryDetailsForUid(
                ConnectivityManager.TYPE_WIFI,
                "",
                0,
                System.currentTimeMillis(),
                packageUid);
    } catch (RemoteException e) {
        return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);
    return bucket.getRxBytes();
}

public long getPackageTxBytesWifi() {
    NetworkStats networkStats = null;
    try {
        networkStats = networkStatsManager.queryDetailsForUid(
                ConnectivityManager.TYPE_WIFI,
                "",
                0,
                System.currentTimeMillis(),
                packageUid);
    } catch (RemoteException e) {
        return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);
    return bucket.getTxBytes();
}
于 2017-01-09T17:36:30.903 に答える