{仅需要在列表视图中显示使用Internet连接的已安装应用程序

时间:2019-02-05 02:24:19

标签: java android android-studio

我需要显示所有使用WiFi或4G互联网连接的应用程序。我已经列出所有应用程序,但我不知道如何过滤它。

我之前曾见过类似的问题,但是我没有尝试过解决这些问题的方法,但是没有奏效。

private List<AppList> getAllInstalledApps() {

        List<AppList> List = new ArrayList<AppList>();
        List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);

        for (int i = 0; i < packs.size(); i++) {
            PackageInfo p = packs.get(i);

            if ((isSystemPackage(p) == false)) {
                String appName = p.applicationInfo.loadLabel(getPackageManager()).toString();
                Drawable icon = p.applicationInfo.loadIcon(getPackageManager());
                List.add(new AppList(appName, icon));

            }
        }
        return List;
    }

    private boolean isSystemPackage(PackageInfo pInfo) {
        return ((pInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true : false;
    }

    public class AppAdapter extends BaseAdapter {

        private LayoutInflater layoutInflater;
        private List<AppList> appInList;

        public AppAdapter(Context context, List<AppList> customizedListView) {
            layoutInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            appInList = customizedListView;
        }
        @Override
        public int getCount() {
            return appInList.size();
        }
        @Override
        public Object getItem(int position) {
            return position;
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ViewHolder listViewHolder;
            if(convertView == null){
                listViewHolder = new ViewHolder();
                convertView = layoutInflater.inflate(R.layout.app_item_layout, parent, false);

                listViewHolder.appNameText = (TextView)convertView.findViewById(R.id.list_app_name);
                listViewHolder.appIcon = (ImageView)convertView.findViewById(R.id.app_icon);
                convertView.setTag(listViewHolder);
            }
            else{
                listViewHolder = (ViewHolder)convertView.getTag();
            }
            listViewHolder.appNameText.setText(appInList.get(position).getName());
            listViewHolder.appIcon.setImageDrawable(appInList.get(position).getIcon());

            return convertView;
        }
    }
    static class ViewHolder{
        TextView appNameText;
        ImageView appIcon;
    }

    public class AppList {

        private String name;
        Drawable icon;

        public AppList(String name, Drawable icon) {
            this.name = name;
            this.icon = icon;
        }

        public String getName() {
            return name;
        }

        public Drawable getIcon() {
            return icon;
        }
    }

我希望它能显示使用互联网连接的设备上安装的所有应用程序。

1 个答案:

答案 0 :(得分:0)

您当前的代码仅允许您获取所有已安装的应用程序并过滤系统应用程序。

如果要过滤使用Internet连接的应用程序,则必须检查权限:android.permission.INTERNET

为此,您不能简单地使用:

List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);

您必须使用:

List<PackageInfo> packs = getPackageManager().getInstalledPackages(PackageManager.GET_PERMISSIONS);

包含此标志可让您查看所获取的应用程序所使用的权限。

然后,类似于您当前正在执行的操作,您将必须遍历每个PackageInfo项目,并检查是否存在INTERNET权限。

private boolean usesInternet(PackageInfo pInfo) {
    if(pInfo.requestedPermissions != null) {
        for(String i : pInfo.requestedPermissions)
            if(i.equals(Manifest.permission.INTERNET)
                return true;
    }
    return false;
}

最后,您可以在过滤if语句中添加使用此方法,如下所示:

for(PackageInfo p : packs){
    if(!isSystemPackage(p)){
        if(usesInternet(p)){
            String appName = p.applicationInfo.loadLabel(getPackageManager()).toString();
            Drawable icon = p.applicationInfo.loadIcon(getPackageManager());
            List.add(new AppList(appName, icon));
        }
    }
}

有了这个,您将首先检查该应用程序是否为系统应用程序。如果不是,那么它将检查INTERNET权限是否是应用程序中声明的权限之一。如果是这样,则将那个应用程序添加到列表中。