2013-04-17 53 views
12

我從服務器下載一個圖像作爲位圖並將其轉換爲drawable,現在我想將此drawable用作通知圖標。但我無法做到這一點。這裏是我的代碼:將Drawable或Bitmap設置爲Android中的通知圖標

Notification notification = new NotificationCompat.Builder(context) 

    .setContentTitle(title) 

    .setContentText(message) 

    .setContentIntent(intent) 

    .setSmallIcon(bitmap) 

    .setWhen(when) 

    .build(); 

但圖標是一個資源的int值,所以當我使用它會給出錯誤。任何幫助

編輯:

現在更新我的代碼和我現在所做的那樣:

  Notification notification = new NotificationCompat.Builder(context) 

     .setContentTitle(title) 

     .setContentText(message) 

     .setContentIntent(intent) 

     .setSmallIcon(icon) 

     .setLargeIcon(bitmap) 

     .setWhen(when) 

     .build(); 

,但它給出了左側的小圖標右側的大圖標。我不希望這所以爲了這個,我刪除setSmallIcon線和運行我的代碼,但它不顯示我的通知

+1

http://stackoverflow.com/a/16051724/931982 ...我在這裏回答 – stinepike

+0

謝謝@StinePike看到我編輯的問題 – User42590

+0

哈哈由於某種原因,我不知道爲什麼..在右側的小圖標稱爲大圖標..只有在那裏你可以設置位圖。在更高的api中,您可以使用自定義佈局 – stinepike

回答

21

如果你讀特定Notification.Builder開發文檔,你會看到setSmallIcon(int icon)需要在一個資源ID應用程序的可繪製包使用

下載圖像,轉換爲位圖,然後將其設置爲setSmallIcon()仍然會給你一個錯誤。

即使你要轉換BitmapDrawable這樣的,例如:

Drawable d = new BitmapDrawable(getResources(), bmpFinal); 

它仍然想給你一個錯誤,因爲那Drawable不是在你的應用程序包存在

唯一可能的解決方案是使用package中存在的Drawable資源,並將其設置爲setSmallIcon()方法。典型用法:

builder.setSmallIcon(R.drawable.ic_launcher); 

或者,setLargeIcon (Bitmap icon)需要一個位圖實例。無需對當前代碼進行任何其他更改(因爲您已有Bitmap),如果它符合您的要求,則可以使用它。

如果不是,則幾乎必須使用Drawable資源,該資源已存在於drawable文件夾之一中。

+5

'setLargeIcon(位圖)'不適合我btw。 – m0skit0

6

有關於這個問題,主要是與API 23+相關的,如果你只在setSmallIcon感興趣的一些點,到2樓和第三個主題。

1:

您可以從一個繪製對象(而不是資源ID)設置LargeIcon,像下面

Drawable drawable= ContextCompat.getDrawable(this,R.drawable.your_drawable); 

      Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); 

      NotificationCompat.Builder mBuilder = 
        new NotificationCompat.Builder(context) 
          .setLargeIcon(bitmap) 
          .setContentTitle("hahah") 
          .setContentText("Tap to stop") 
          .setOngoing(true); 

第二:

如果您需要在API設置SmallIcon低於23,您需要設置一個資源ID,如R.drawable.your_resource。 NotificationCompat.Builder不允許您使用Drawable s or Bitmaps in setSmallIcon()`。

3:

幸運的是,支持已經在23+版本擴大到Icon類型上setSmallIcon(),使用Notification.Builder,像以下:

Drawable drawable = ContextCompat.getDrawable(this,R.drawable.your_drawable); 

      Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); 

      Notification.Builder mBuilder = 
        new Notification.Builder(context) 
          .setSmallIcon(Icon.createWithBitmap(bitmap)) 
          .setLargeIcon(bitmap) 
          .setContentTitle("hahah") 
          .setContentText("Tap to stop") 
          .setOngoing(true); 
+1

感謝您的最後一個,即使仍然沒有舊版本的解決方案..好好知道反正 – Jenix

1

更好的選擇,讓應用程序圖標

Drawable drawable=getApplicationInfo().loadIcon(getPackageManager()); 
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); 



.setSmallIcon(getApplicationInfo().icon) 
.setLargeIcon(bitmap)