-3

I'm trying to do an app with all installed app's name, permissions and icon. I have done successfully the first and the second, but I don't know what to do for the third.

Here it is AppsAdapter class:

class AppsAdapter extends BaseAdapter {

private final Context mContext;
private List<Pair<String, List<String>>> mAppsWithPermission;

public AppsAdapter(Context context, List<Pair<String, List<String>>> appsWithPermission) {
    mContext = context;
    mAppsWithPermission = appsWithPermission;
}

static class ViewHolder {
    public TextView appName;
    public TextView appPermissions;
    public ImageView appIcon;
}

@Override
public int getCount() {
    return mAppsWithPermission.size();
}

@Override
public Object getItem(int position) {
    return mAppsWithPermission.get(position);
}

@Override
public long getItemId(int position) {
    return mAppsWithPermission.get(position).hashCode();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null) {

        convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
        holder = new ViewHolder();
        holder.appName = convertView.findViewById(R.id.list_item_appname);
        holder.appPermissions = convertView.findViewById(R.id.list_item_apppermissions);
        holder.appIcon = convertView.findViewById(R.id.list_item_appicon);
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    Pair<String, List<String>> item = mAppsWithPermission.get(position);

    holder.appName.setText(item.first);
    holder.appPermissions.setText(item.second.toString());


    return convertView;

}
}

MainActivity:

public class MainActivity extends AppCompatActivity{


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final PackageManager packageManager = getPackageManager();

    final ApplicationInfo packageNames = new ApplicationInfo();

    final List<Pair<String, List<String>>> appsWithPermission = new ArrayList<>();

    final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    final List<ResolveInfo> apps = packageManager.queryIntentActivities(mainIntent, 0);
    for (ResolveInfo info : apps) {
        final ApplicationInfo applicationInfo = info.activityInfo.applicationInfo;
        final String appName = (String) applicationInfo.loadLabel(packageManager);

        final List<String> permissions = new ArrayList<>();

        if (appName != null) {

            try {
                final PackageInfo packageInfo = packageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_PERMISSIONS);
                final String[] requestedPermissions = packageInfo.requestedPermissions;

                if (requestedPermissions != null) {
                    permissions.addAll(Arrays.asList(requestedPermissions));
                }

            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }

        appsWithPermission.add(new Pair<>(appName, permissions));
    }

    final ListView listView = findViewById(R.id.list_view);
    final AppsAdapter appsAdapter = new AppsAdapter(this, appsWithPermission);
    listView.setAdapter(appsAdapter);

}
}

I've uploaded also the updated MainActivity.

I'm trying to get the app icon.

What should I do?

Thanks in advance

Faby

Cœur
  • 37,241
  • 25
  • 195
  • 267
faby GT
  • 11
  • 2
  • 9
  • https://developer.android.com/reference/android/content/pm/PackageItemInfo.html#loadIcon(android.content.pm.PackageManager) – CommonsWare Feb 17 '18 at 14:23
  • Thank you, but can you please adapt it to my code? I can't adapt it... thanks – faby GT Feb 17 '18 at 14:30
  • Adapt ? you asked question about `PackageManager` and i don't see a single line about it in your code . Search for tutorials instead . – ADM Feb 17 '18 at 14:59

2 Answers2

2

I would suggest to refactor your adapter to hold a List<PackageItemInfo>. Somewhere in your app you call PackageManager.getInstalledPackages which gives you the list of PackageItemInfo objects back - pass it to your adapter. Then use PackageItemInfo.loadIcon to load the corresponding icon into your ImageView.

artkoenig
  • 7,117
  • 2
  • 40
  • 61
  • Hi I've updated and uploaded MainActivity. Can you please help me? What should I do now? Thanks in advance – faby GT Feb 18 '18 at 16:31
0

try this

try {
      String pkg = "com.simple.app";//your package name
      Drawable icon = getContext().getPackageManager().getApplicationIcon(pkg);
     imageView.setImageDrawable(icon);
   } catch (PackageManager.NameNotFoundException ne) {
}
Rohit Chauhan
  • 1,119
  • 1
  • 12
  • 30