Get All Installed Application icons in Android : java.lang.ClassCastException

前端 未结 3 921
北海茫月
北海茫月 2020-12-16 18:17

There is a java.lang.ClassCastException when I am trying to get a installed applications icon.

Here is my code.

public Bitmap getAppIcon         


        
相关标签:
3条回答
  • 2020-12-16 18:31

    Your Problem is that your Icon is no instance of BitmapDrawable, one can check like that:

    Bitmap APKicon;
    if(icon instanceof BitmapDrawable) {
      APKicon  = ((BitmapDrawable)icon).getBitmap();
    }
    

    in this case your solution would be right, one can just cast it, but if not (and that is your case) one needs to do something like that:

    else{
         Bitmap bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(),icon.getIntrinsicHeight(), Config.ARGB_8888);
         Canvas canvas = new Canvas(bitmap); 
         icon.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
         icon.draw(canvas);
         APKicon = bitmap;
    }
    

    this solution will work in any case

    0 讨论(0)
  • 2020-12-16 18:31
    Caused by: java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
    

    Problem :

    You are trying to typecast BitmapDrawable to NinePatchDrawable

    Solution:

    Try this:

    public Bitmap getAppIcon(String path) {
            PackageInfo pi = pm.getPackageArchiveInfo(path, 0);
            pi.applicationInfo.sourceDir = path;
            pi.applicationInfo.publicSourceDir = path;
            Drawable icon = pi.applicationInfo.loadIcon(pm);
            Bitmap APKicon = ((NinePatchDrawable) icon).getBitmap();  // cast to NinePatchDrawable
            return APKicon;
        }
    

    PackageManager.GetApplicationInfo returns a Drawable object. It might not be a BitmapDrawable.

    You can test whether it is a BitmapDrawable with:

    If pm.GetApplicationIcon(packname) Is BitmapDrawable Then ...

    If you want to convert a non-BitmapDrawable to a BitmapDrawable then you need to:

    • Create a mutable bitmap.
    • Draw the drawable with Canvas.DrawDrawable
    0 讨论(0)
  • 2020-12-16 18:34
    public Bitmap getAppIcon(String path) {
        PackageInfo pi = pm.getPackageArchiveInfo(path, 0);
        Drawable icon = pi.applicationInfo.loadIcon(pm);
        Bitmap APKicon = ((NinePatchDrawable) icon).getBitmap();
        return APKicon;
    }
    

    You have to cast the icon into NinePatchDrawable (line 4).

    0 讨论(0)
提交回复
热议问题