Android 9 增加以太網(wǎng)數(shù)據(jù)流量統(tǒng)計(jì)功能

  1. NetworkStatsManager 中增加 TYPE_ETHERNET 類型
 private static NetworkTemplate createTemplate(int networkType, String subscriberId) {
       final NetworkTemplate template;
       switch (networkType) {
           case ConnectivityManager.TYPE_MOBILE:
               template = subscriberId == null
                       ? NetworkTemplate.buildTemplateMobileWildcard()
                       : NetworkTemplate.buildTemplateMobileAll(subscriberId);
               break;
           case ConnectivityManager.TYPE_WIFI:
               template = NetworkTemplate.buildTemplateWifiWildcard();
               break;
           case ConnectivityManager.TYPE_ETHERNET:
               template = NetworkTemplate.buildTemplateEthernet();
               break;
           default:
               throw new IllegalArgumentException("Cannot create template for network type "
                       + networkType + ", subscriberId '"
                       + NetworkIdentity.scrubSubscriberId(subscriberId) + "'.");
       }
       return template;
   }

2 . 應(yīng)用就可以按照一下調(diào)用


 if(hasPermissionToReadNetworkStats()){
            val networkStatsManager = getSystemService(NETWORK_STATS_SERVICE) as NetworkStatsManager
            var networkStatsHelper = NetworkStatsHelper(networkStatsManager)
            var bucket: NetworkStats.Bucket? = null
            bucket = networkStatsManager.querySummaryForDevice(
                ConnectivityManager.TYPE_ETHERNET
                "",
                0,
                System.currentTimeMillis()
            )
            findViewById<TextView>(R.id.tv).text = "流量1為:${((bucket.rxBytes + bucket.txBytes)/1024/1024).toFloat()}"
            networkStatsHelper.getEveryAppData(this);
        }




private fun hasPermissionToReadNetworkStats(): Boolean {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return true
        }
        val appOps = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
        val mode = appOps.checkOpNoThrow(
            AppOpsManager.OPSTR_GET_USAGE_STATS,
            Process.myUid(), packageName
        )
        if (mode == AppOpsManager.MODE_ALLOWED) {
            return true
        }
        requestReadNetworkStats()
        return false
    }

    // 打開“有權(quán)查看使用情況的應(yīng)用”頁(yè)面
    private fun requestReadNetworkStats() {
        val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
        startActivity(intent)
    }

  1. 獲取每個(gè)應(yīng)用流量
public void getEveryAppData(MainActivity ma) throws RemoteException {
        NetworkStats summaryStats;
        long summaryRx = 0;
        long summaryTx = 0;
        NetworkStats.Bucket summaryBucket = new NetworkStats.Bucket();
        long summaryTotal = 0;
        summaryStats = networkStatsManager.querySummary(ConnectivityManager.TYPE_WIFI, "", 0, System.currentTimeMillis());
        do {
            summaryStats.getNextBucket(summaryBucket);
            int summaryUid = summaryBucket.getUid();
            Log.i(MainActivity.class.getSimpleName(), "uid:" + summaryBucket.getUid() + " rx:" + summaryBucket.getRxBytes() +
                    " tx:" + summaryBucket.getTxBytes()+ "包名  "+ma.getPackageManager().getNameForUid(summaryBucket.getUid()));
            summaryTotal += summaryBucket.getRxBytes() + summaryBucket.getTxBytes();
            Log.i(MainActivity.class.getSimpleName(), "總的流量:" + summaryTotal/1024/1024 );
        } while (summaryStats.hasNextBucket());
    }

由于獲取的流量是分段的需要自己累加起來就是總的流量使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容