Android 监控用户自装软件流量

来源:互联网 发布:中关村世纪网络大厦 编辑:程序博客网 时间:2024/04/29 18:00

首先获取手机上安装的所有应用,过滤掉系统原装应用,对用户自装的软件进行判断,保留有网络权限的应用,再根据TrafficStats 得到每个应用使用的流量大小。

FlowDataActivity.java

public class FlowDataActivity extends AppCompatActivity {    ListView listView;    private List<HashMap<String,Object>> hashMapList;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_flow_data);        getAppTrafficList();        initView();        initData();    }    private void initView() {        listView = (ListView) findViewById(R.id.flowList);    }    private void initData() {        listView.setAdapter(new FlowDataAdapter(hashMapList,this));    }    public void getAppTrafficList(){        //获取所有的安装在手机上的应用软件的信息,并且获取这些软件里面的权限信息        PackageManager pm=getPackageManager();//获取系统应用包管理        //获取每个包内的androidmanifest.xml信息,它的权限等等        List<PackageInfo> pinfos=pm.getInstalledPackages                (PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_PERMISSIONS);        //遍历每个应用包信息        hashMapList = new ArrayList<>();        for(PackageInfo info:pinfos){            //以下是用户自装应用            if((info.applicationInfo.flags& ApplicationInfo.FLAG_SYSTEM)==0)            {                //请求每个程序包对应的androidManifest.xml里面的权限                String[] premissions=info.requestedPermissions;                if(premissions!=null && premissions.length>0){                    //找出需要网络服务的应用程序                    for(String premission : premissions){                        if("android.permission.INTERNET".equals(premission)){                            //获取每个应用程序在操作系统内的进程id                            HashMap<String,Object> hashmap = new HashMap<>();                            int uId=info.applicationInfo.uid;                            //如果返回-1,代表不支持使用该方法,注意必须是2.2以上的                            long rx= TrafficStats.getUidRxBytes(uId);                            //如果返回-1,代表不支持使用该方法,注意必须是2.2以上的                            long tx=TrafficStats.getUidTxBytes(uId);                            if(rx<0 || tx<0){                                continue;                            }else{                                hashmap.put("appImage",info.applicationInfo.loadIcon(pm));                                hashmap.put("appName",info.applicationInfo.loadLabel(pm));                                hashmap.put("appFlowData", Formatter.formatFileSize(this, rx+tx));                                hashMapList.add(hashmap);                            }                        }                    }                }            }        }    }}

当前主界面的布局文件activity_flow_data.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    >    <ListView        android:id="@+id/flowList"        android:layout_width="match_parent"        android:layout_height="wrap_content"        >    </ListView></RelativeLayout>

列表的布局文件list_flow_data.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    >    <ImageView        android:id="@+id/appImage"        android:layout_width="50dp"        android:layout_height="50dp"/>    <TextView        android:id="@+id/appName"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_toRightOf="@+id/appImage"        android:layout_centerVertical="true"/>    <TextView        android:id="@+id/appFlowData"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_centerVertical="true"/></RelativeLayout>

adapter适配器的内容 FlowDataAdapter.java

public class FlowDataAdapter extends BaseAdapter {    private List<HashMap<String,Object>> hashMapList;    private Context context;    public final class ViewHolder {                //自定义控件集合        public ImageView appImage;        public TextView appName;        public TextView appFlowData;    }    public FlowDataAdapter(List<HashMap<String,Object>> hashMapList, Context context) {        this.hashMapList = hashMapList;        this.context = context;    }    @Override    public int getCount() {        return hashMapList.size();    }    @Override    public Object getItem(int position) {        return hashMapList.get(position);    }    @Override    public long getItemId(int position) {        return 0;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder viewHolder = null;        if(convertView==null)        {            viewHolder = new ViewHolder();            convertView = LayoutInflater.from(context).inflate(R.layout.list_flow_data,null);            viewHolder.appName = (TextView) convertView.findViewById(R.id.appName);            viewHolder.appFlowData = (TextView) convertView.findViewById(R.id.appFlowData);            viewHolder.appImage = (ImageView) convertView.findViewById(R.id.appImage);            convertView.setTag(viewHolder);        }        else        {            viewHolder = (ViewHolder) convertView.getTag();        }        viewHolder.appName.setText(hashMapList.get(position).get("appName").toString());        viewHolder.appFlowData.setText(hashMapList.get(position).get("appFlowData").toString());        viewHolder.appImage.setImageDrawable((Drawable) hashMapList.get(position).get("appImage"));        return convertView;    }}
0 0
原创粉丝点击