1

我可以使用意圖過濾器來收集所有已安裝啓動器的列表。麻煩的是撤出對應用程序圖標的int引用。下面的代碼捕獲NameNotFoundException錯誤。獲取已安裝啓動器的所有應用程序圖標列表,並在遠程視圖中顯示每個圖標

public RemoteViews getViewAt(int position) { 
    PackageManager pm = mContext.getPackageManager(); 
    Intent i = new Intent("android.intent.action.MAIN"); 
    i.addCategory("android.intent.category.HOME"); 
    List<ResolveInfo> lst = pm.queryIntentActivities(i, 0); 


    RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item); 

    if(position < lst.size()) { 

     try { 
      ApplicationInfo ai = pm.getApplicationInfo(lst.get(position).activityInfo.name, 0); 
      int iconId = ai.icon; 
      rv.setInt(R.id.widget_item, "setBackgroundResource", iconId); 
     } catch (NameNotFoundException e) { 
      //Toast.makeText(mContext, "Fail: " + e, Toast.LENGTH_SHORT).show(); 
      Log.d("Error: ", e.toString()); 
     } 
    } 

的問題是這一行:

ApplicationInfo ai = pm.getApplicationInfo(lst.get(position).activityInfo.name, 0); 

不activityInfo.name無法返回包名?

回答

0

解決了我的問題,並進行了以下更改。

非但沒有一個int參照這樣的圖標:

ApplicationInfo ai = pm.getApplicationInfo(lst.get(position).activityInfo.name, 0); 
int iconId = ai.icon; 

我用下面的代碼來獲取圖標作爲繪製對象:

Drawable icon = lst.get(position).activityInfo.applicationInfo.loadIcon(pm); 

然後我不得不把圖標轉換從一個可繪製的位圖:

Bitmap iconBit = drawableToBitmap(icon); 

... 

public static Bitmap drawableToBitmap (Drawable drawable) { 
    if (drawable instanceof BitmapDrawable) { 
     return ((BitmapDrawable)drawable).getBitmap(); 
    } 

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
    drawable.draw(canvas); 

    return bitmap; 
} 

最後,而不是試圖改變背景像這樣的ImageView來源:

rv.setInt(R.id.widget_item, "setBackgroundResource", iconId); 

我用setImageViewBitmap:

rv.setImageViewBitmap(R.id.widget_item, iconBit); 

我希望這是幫助他人。我用Kabuko的答案從下面的帖子中將Drawable轉換爲位圖: How to convert a Drawable to a Bitmap?

相關問題