2013-08-27 31 views
11

当我试图获取已安装的应用程序图标时,有一个java.lang.ClassCastException在Android中获取所有安装的应用程序图标:java.lang.ClassCastException

这是我的代码。

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 = ((BitmapDrawable) icon).getBitmap(); 
     return APKicon; 
    } 

其中,pm

PackageManager pm = getPackageManager(); 

,并在LogCat所示的错误是

Caused by: java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable 

希望有人能帮助我。

+0

检查这个话题请http://stackoverflow.com/questions/10623570/how-to-programmatically-re-apply-a-9-patch-image-to -an-imageview –

回答

19

您的问题是,你的图标没有BitmapDrawable的情况下,可以检查这样的:

Bitmap APKicon; 
if(icon instanceof BitmapDrawable) { 
    APKicon = ((BitmapDrawable)icon).getBitmap(); 
} 
在这种情况下

您的解决方案是正确的话,只投它,但如果没有(和是你的情况下),一个需要做这样的事情:

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

该解决方案将在任何情况下工作

+0

好!这项工作!谢谢! –

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

您必须将图标投入NinePatchDrawable(第4行)。

0
Caused by: java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable 

问题:

您正试图强制转换BitmapDrawableNinePatchDrawable

解决方案:

试试这个:

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返回Drawable对象。它可能不是BitmapDrawable

您可以测试它是否是一个BitmapDrawable:

如果pm.GetApplicationIcon(packname)BitmapDrawable则...

如果你想在非BitmapDrawable转换为BitmapDrawable那么你需要:

  • 创建一个可变的位图。
  • 绘制绘制与Canvas.DrawDrawable
+0

downvoter关心评论?? –

+1

我没有downvote,但我看到消息“该方法getBitmap()未定义类型NinePatchDrawable” –

相关问题