11

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

誰かが私を助けてくれることを願っています。

4

3 に答える 3

19

あなたの問題は、あなたの Icon が 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;
}

このソリューションは、どのような場合でも機能します

于 2013-08-27T07:44:06.670 に答える
0
Caused by: java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable

問題 :

あなたは型キャストしようとしていBitmapDrawableますNinePatchDrawable

解決:

これを試して:

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 でドローアブルを描画する
于 2013-08-27T07:51:48.563 に答える
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 行目)にキャストする必要があります。

于 2013-08-27T07:41:36.410 に答える