连接互联网的安卓应用程序列表

4

我希望能够实现一个列表视图,展示安卓应用程序及其网络使用情况。为此,首先我需要列出所有的应用程序,我已经使用了PackageManager来完成这个任务,代码如下:

  packageManager = getPackageManager();
    List<PackageInfo> packageList = packageManager
            .getInstalledPackages(PackageManager.GET_META_DATA);

apkList = (ListView) findViewById(R.id.applist);
    apkList.setAdapter(new ApkAdapter(this, packageList, packageManager));

但是这段代码列出了所有系统应用程序,例如:Android系统、计算器、日历、状态栏、动态壁纸等,这看起来不太合适。我尝试使用以下方法过滤系统应用程序:

 /*To filter out System apps*/
    for(PackageInfo pi : packageList) {
        boolean b = isSystemPackage(pi);
        if(!b) {
            packageList1.add(pi);
        }
    }

但是这段代码只显示已安装的应用程序,例如 WhatsApp、Tango、Foursquare 等。它不会显示 Gmail、Facebook、浏览器、地图等应用程序。 有没有人能建议我如何编写代码,只显示实际使用互联网的应用程序列表。提前感谢!


由于 Gmail、Facebook、浏览器和地图等应用都是系统应用,所以您已将其过滤掉了。一种可能的解决方案是从过滤中排除特定的系统包。 - Nizam
2个回答

4
我想实现一个列表视图,显示Android应用程序及其互联网使用情况。有人能建议一下我如何编写代码,只显示实际使用互联网的应用程序吗?
一个解决方案(也许是最好的并且我能想到的)是使用TrafficStats类来计算通过网络传输的数据(TCP,UDP)。在你的情况下,你需要为每个UID获取数据(每个应用程序都有自己的UID)。
你需要知道的所有内容是应用程序是否通过网络传输了更多的字节,当你知道这一点时,你可以说“这个应用程序使用了网络”。
这里是你可以使用的伪代码:
List<Application> collection = new ArrayList<Application>();
Application app = null; // some custom object is good approach
PackageManager pm = getActivity().getPackageManager();
for (ApplicationInfo info: pm.getInstalledApplications(
                                                PackageManager.GET_META_DATA)) {

   // received data by application
   long downloaded = TrafficStats.getUidRxBytes(info.uid);

   // transmitted data by application
   long uploaded = TrafficStats.getUidTxBytes(info.uid);

   // filter system applications only
   if ((info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {

      // check if application has network usage
      if (downloaded > 0 || uploaded > 0) {

         // it's application you want
      }
   }
   // non-system application
   else {
      if (downloaded > 0 || uploaded > 0) {

         // it's application you want
      }
   }
}

重要的是要说,TrafficStats可以从API 8开始使用,在JELLY_BEAN_MR2之前,这可能会在不支持统计数据的设备上返回不支持。我使用了这种方法,从未遇到问题。
注意:我还想提到可能存在其他可能的方法,例如从一些系统文件中读取,但这是(至少对我来说)硬编码的方法,我不建议使用它(在各种设备上,文件可能位于不同的位置,具有不同的内容和不同的文件名)。
希望这能帮助您解决问题。

0

应用程序使用互联网将需要互联网权限 您可以通过勾选PackageInfo.permission来过滤掉这些应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接