獲得每個App的上傳、下載的流量。
思路就是獲取到我們手機上的所有app,再獲得app里面使用的權限,如果app有網絡權限,就顯示出來。
代碼很簡單,代碼里面也有比較詳細的注釋,下面直接上代碼
布局文件:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 android:paddingBottom="@dimen/activity_vertical_margin" 10 tools:context="com.example.fanlei.mycontentproviderdemo.TrafficActivity"> 11 12 <TextView 13 android:id="@+id/show_liuliang" 14 android:text="@string/hello_world" 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" /> 17 18 <Button 19 android:id="@+id/btn_scan" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:text="獲取App流量"/> 23 24 <ListView 25 android:id="@+id/listView" 26 android:layout_width="match_parent" 27 android:layout_height="wrap_content"> 28 29 </ListView> 30 </LinearLayout>
主函數:
1 package com.example.fanlei.mycontentproviderdemo; 2 3 import android.content.pm.PackageInfo; 4 import android.content.pm.PackageManager; 5 import android.net.TrafficStats; 6 import android.os.Bundle; 7 import android.support.v7.app.ActionBarActivity; 8 import android.view.View; 9 import android.widget.Button; 10 import android.widget.ListView; 11 import android.widget.SimpleAdapter; 12 import android.widget.TextView; 13 14 import java.util.ArrayList; 15 import java.util.HashMap; 16 import java.util.List; 17 import java.util.Map; 18 19 20 public class TrafficActivity extends ActionBarActivity { 21 22 private TextView show_liuliang;//顯示流量 23 private Button btn_scan; 24 private ListView listView; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_traffic_activity); 30 31 show_liuliang = (TextView) findViewById(R.id.show_liuliang); 32 listView = (ListView) findViewById(R.id.listView); 33 btn_scan = (Button) findViewById(R.id.btn_scan); 34 35 long mrb = TrafficStats.getMobileRxBytes(); //手機接收的字節數,非WiFi狀態 36 37 long mtb = TrafficStats.getMobileTxBytes(); //手機發送的字節數,非WiFi狀態 38 39 long tMrb = TrafficStats.getTotalRxBytes(); //全部接收的字節數 40 41 long tMtb = TrafficStats.getTotalTxBytes(); //全部發送的字節數 42 43 StringBuilder sb = new StringBuilder(); 44 sb.append("非WiFi總接受:").append(byteToMB(mrb)); 45 sb.append("非WiFi總發送:").append(byteToMB(mtb)); 46 sb.append("全部接收:").append(byteToMB(tMrb)); 47 sb.append("全部發送:").append(byteToMB(tMtb)); 48 49 show_liuliang.setText(sb.toString());//顯示 50 51 btn_scan.setOnClickListener(new View.OnClickListener() { 52 @Override 53 public void onClick(View v) { 54 PackageManager pm = getPackageManager(); //拿到包管理者 55 //拿到包的信息 PackageInfo是系統的一個類 56 List<PackageInfo> info = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES 57 |PackageManager.GET_PERMISSIONS); 58 List<Map<String,String>> appInfo = new ArrayList<>();//用於存放App的名稱,上傳和下載的字節 59 /** 60 * 通過看它有沒有網絡權限權限 61 */ 62 for (PackageInfo temp:info){ 63 String permissions[] = temp.requestedPermissions; //拿到該包的權限 64 if (permissions!= null && permissions.length > 0){ //如果有權限 65 for (String p : permissions){ 66 if (p.equals("android.permission.INTERNET")){//是否有網絡權限 67 String appName = temp.applicationInfo.loadLabel(pm).toString(); //App名稱 68 long appMrb = TrafficStats.getUidRxBytes(temp.applicationInfo.uid);//App接收的字節 69 long appMtb = TrafficStats.getUidTxBytes(temp.applicationInfo.uid);//App發送的字節 70 String str = appName + "下載:"+byteToMB(appMrb)+"上傳:"+byteToMB(appMtb); 71 Map<String,String> map = new HashMap<>(); 72 map.put("info",str); 73 appInfo.add(map); 74 } 75 } 76 } 77 } 78 79 SimpleAdapter simpleAdapter = new SimpleAdapter(getBaseContext(), 80 appInfo, 81 android.R.layout.simple_list_item_1, 82 new String[]{"info"}, 83 new int[]{android.R.id.text1}); 84 85 listView.setAdapter(simpleAdapter);//設置Adapter 86 } 87 }); 88 } 89 //將字節數轉化為MB 90 private String byteToMB(long size){ 91 long kb = 1024; 92 long mb = kb*1024; 93 long gb = mb*1024; 94 if (size >= gb){ 95 return String.format("%.1f GB",(float)size/gb); 96 }else if (size >= mb){ 97 float f = (float) size/mb; 98 return String.format(f > 100 ?"%.0f MB":"%.1f MB",f); 99 }else if (size > kb){ 100 float f = (float) size / kb; 101 return String.format(f>100?"%.0f KB":"%.1f KB",f); 102 }else { 103 return String.format("%d B",size); 104 } 105 } 106 107 }
虛擬機效果圖,由於我的虛擬機不能上網,故沒有流量的使用