{нужно отображать в списке только установленные приложения, использующие интернет-соединение - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно показать все приложения, использующие интернет-соединение, либо 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 голосов
/ 05 февраля 2019

Ваш текущий код позволяет вам только выбирать все установленные приложения и фильтровать их для системных приложений.

Если вы хотите отфильтровать приложения, использующие подключение к Интернету, вам необходимо проверить разрешение: android.permission.INTERNET.

Для этого вы не можете просто использовать:

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

Вам придется использовать:

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

Включение этого флага позволяет вам смотреть вразрешения, которые используются для приложений, которые вы выбираете.

Впоследствии, аналогично тому, что вы делаете в настоящее время, вам придется перебирать каждый из элементов PackageInfo и проверять наличие разрешения ИНТЕРНЕТ.

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));
        }
    }
}

С этим вы будете сначала проверять, является ли приложениеСистемное приложение или нет.Если это не так, то он проверит, является ли разрешение ИНТЕРНЕТ одним из объявленных разрешений в приложении.Если это так, то вы добавляете это приложение в свой список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...