Android:可绘制图标不可见

时间:2020-09-04 10:08:29

标签: android android-studio android-drawable

我试图获取设备上已安装的应用程序列表,并在RecyclerView中将其及其图标显示出来。

以下代码用于获取应用程序:

Intent intent = new Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> installedApps= packageManager.queryIntentActivities(intent, 0);

        installedApps.forEach(p-> {
            String appName = p.loadLabel(packageManager).toString();
            String appPackageName = p.activityInfo.packageName;
            Drawable icon = p.loadIcon(packageManager);
            ApplicationInfo info = p.activityInfo.applicationInfo;

            App_Object appObject = new App_Object(appName, appPackageName, icon, info);
            if(!List_AllApps.contains(appObject)) {
                List_AllApps.add(appObject);
            }
        });
        
List_AllApps.sort(Comparator.comparing(o -> o.app_name));

这里的问题是,即使某些Drawable不为null,它们还是不可见并且无法显示。

我发现上述Drawables确实具有icon.getIntrinsicHeight()和icon.getIntrinsicWidth()为0,这导致它们不可见。

我已经尝试将Drawables转换为ShapeDrawables,因为您可以在那里使用setIntrinsicWidth()和setIntrinsicHeight(),但是我没有成功。 我还尝试设置未显示的Drawable的边界,并尝试将其转换为BitmapDrawables,但没有任何结果。

奇怪的是,有时图标在显示时没有对代码做任何更改,所以这真的让我感到困惑,我还可以尝试解决此问题(getIntrinsicWidth()和getIntrinsicHeight()大于0并具有所需的值。

如何解决此问题?我可以通过其他任何方式调整它们的大小,以便它们显示吗?

下面是在Recyclerview中为Imageview设置Drawable时的外观图: Image

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

要显示设备上安装的应用程序的列表,可以使用程序包管理器的GET_META_DATA。

public void getInstalledApplication() {
  PackageManager pm = getPackageManager();
  List < ApplicationInfo > packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
  //You have all list of packages in the device.
  for (ApplicationInfo packageInfo: packages) {
//Check if the application is updated or not
    if ((packageInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
      addToInstalledApps(packageInfo, pm);
    } else if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {//This application is installed in the device system's image

    } else {
      addToInstalledApps(packageInfo, pm);
    }
  }
}

现在,您可以获取设备的appName和appIcon。下面是方法。

    public void addToInstalledApps(ApplicationInfo packageInfo, PackageManager pm) {
        int stringId = packageInfo.labelRes;
        String appName = null;
        Drawable appIcon = null;
        try {
            appName = (String) pm.getApplicationLabel(packageInfo);
            appIcon = pm.getApplicationIcon(packageInfo);
        } catch (Exception e) {
            try {
                appName = stringId == 0 ? (packageInfo.nonLocalizedLabel != null ? packageInfo.nonLocalizedLabel.toString() : null) : getString(stringId);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            //Exception
            e.printStackTrace();
        }
        if(pm.getLaunchIntentForPackage(packageInfo.packageName) != null && CommonUtil.isValidString(appName)){
        //Now you can design your model and insert data as you want.
            AppDetailsModel appDetailsModel = new AppDetailsModel(packageInfo.packageName, packageInfo.sourceDir, pm.getLaunchIntentForPackage(packageInfo.packageName), appName, appIcon);
            
            appDetailsModelList.add(appDetailsModel);
        }

    }

答案 1 :(得分:0)

由于大小为0,您正面临问题。 尝试使用此代码。可能有助于增加尺寸。

    private void checkAllPackageData() {
        PackageManager packageManager = getActivity().getPackageManager();
        Intent intent = new Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> installedApps= packageManager.queryIntentActivities(intent, 0);
        for (ResolveInfo p : installedApps){
            String appName = p.loadLabel(packageManager).toString();
            String appPackageName = p.activityInfo.packageName;
            Drawable icon = p.loadIcon(packageManager);
            ApplicationInfo info = p.activityInfo.applicationInfo;
            try {
                Bitmap bitmap= ((BitmapDrawable) icon).getBitmap();
                System.out.println("Before "+ bitmap.getHeight());
                Bitmap bitmap1= bitmap.copy(Bitmap.Config.ARGB_8888, true);
                Bitmap bitmap2 =  getResizedBitmap(bitmap1,35,35);
                System.out.println(bitmap2.getHeight());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {
        int width = bm.getWidth();
        int height = bm.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // CREATE A MATRIX FOR THE MANIPULATION
        Matrix matrix = new Matrix();
        // RESIZE THE BIT MAP
        matrix.postScale(scaleWidth, scaleHeight);

        // "RECREATE" THE NEW BITMAP
        Bitmap resizedBitmap = Bitmap.createBitmap(
                bm, 0, 0, width, height, matrix, false);
        bm.recycle();
        return resizedBitmap;
    }

相关问题