Android 监控用户自装软件流量

首先获取手机上安装的所有应用,过滤掉系统原装应用,对用户自装的软件进行判断,保留有网络权限的应用,再根据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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值