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
- Android 监控用户自装软件流量
- android如何开发流量监控软件
- android如何开发流量监控软件
- android如何开发流量监控软件
- android如何开发流量监控软件
- Android流量监控
- Android流量监控
- android流量监控
- android流量监控
- android流量监控 Emmagee
- Android流量监控
- Android 程序流量监控
- android流量监控
- Android 流量监控
- Android流量监控
- Android流量监控
- NADetector实时流量监控软件
- Android 上网流量监控方法
- Alcatraz的安装和使用
- android 消息机制
- TCP与UDP的区别
- iOS中UITextView的字数限制
- 【<meta name="description" content=">】作用讲解
- Android 监控用户自装软件流量
- MYSQL死掉后自动重启脚本
- cocos2dx学习之路----第二篇(相关概念类介绍及HelloWorld分析)
- 利用html5 Api 实现分页
- 【翻译】Leapmotion-python开发官方文档(1)
- FZU-1515 Balloons in a Box
- LeetCode Add Two Numbers
- 你想建设一个能承受500万PV/每天的网站吗?
- Spring事务管理只对出现运行期异常进行回滚