8

我遇到了創建並正確發送通知的問題。我在此閱讀新的Lollipop 5.0 update通知設計規範:https://material.google.com/style/icons.htmlhttps://material.google.com/patterns/notifications.html,我意識到圖標需要爲white才能正確顯示。這很好,我完全理解,但我希望我的通知能夠顯示一張圖片,這顯然不能是白色的。然而,真正令我困惑的是,當我嘗試在手機上呈現通知時,一切正常。它看起來是這樣的:作爲大圖標通知的Facebook圖像在不同的手機上顯示爲白色?

enter image description here

然而,朋友的手機上,它看起來像一個白色正方形,這樣的事情:

enter image description here

很奇怪,因爲我們都具有相同的Android版本6.0.1。下面是我用來發送通知的代碼:

private class NotificationPicture extends AsyncTask<String, Void, Bitmap> { 

     Context context; 
     String userId; 
     String postId; 
     String name; 
     String notificationBody; 
     String from; 

     public NotificationPicture(Context context) { 
      super(); 
      this.context = context; 
     } 

     @Override 
     protected Bitmap doInBackground(String... params) { 
      userId = params[0]; 
      postId = params[1]; 
      name = params[2]; 
      notificationBody = params[3]; 
      from = params[4]; 
      try { 
       URL url = new URL("https://graph.facebook.com/" + userId + "/picture?type=large"); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.setDoInput(true); 
       connection.connect(); 
       InputStream in = connection.getInputStream(); 
       Bitmap bitmap = BitmapFactory.decodeStream(in); 
       Bitmap output; 
       Rect srcRect; 
       if (bitmap.getWidth() > bitmap.getHeight()) { 
        output = Bitmap.createBitmap(bitmap.getHeight(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); 
        srcRect = new Rect((bitmap.getWidth()-bitmap.getHeight())/2, 0, bitmap.getWidth()+(bitmap.getWidth()-bitmap.getHeight())/2, bitmap.getHeight()); 
       } else { 
        output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getWidth(), Bitmap.Config.ARGB_8888); 
        srcRect = new Rect(0, (bitmap.getHeight()-bitmap.getWidth())/2, bitmap.getWidth(), bitmap.getHeight()+(bitmap.getHeight()-bitmap.getWidth())/2); 
       } 

       Canvas canvas = new Canvas(output); 
       final int color = 0xff424242; 
       final Paint paint = new Paint(); 
       final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 

       float r; 

       if (bitmap.getWidth() > bitmap.getHeight()) { 
        r = bitmap.getHeight()/2; 
       } else { 
        r = bitmap.getWidth()/2; 
       } 

       paint.setAntiAlias(true); 
       canvas.drawARGB(0, 0, 0, 0); 
       paint.setColor(color); 
       canvas.drawCircle(r, r, r, paint); 
       paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
       canvas.drawBitmap(bitmap, srcRect, rect, paint); 
       return output; 
      } catch (IOException e) { 
       FirebaseCrash.report(e); 
       return null; 
      } 
     } 

     @Override 
     protected void onPostExecute(Bitmap result) { 

      super.onPostExecute(result); 
      try { 
       NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context) 
         .setContentTitle(getString(R.string.app_name)) 
         .setContentText(notificationBody) 
         .setTicker(from + " has responded!") 
         .setAutoCancel(true) 
         .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
         .setStyle(new NotificationCompat.BigTextStyle().bigText(notificationBody)) 
         .setSmallIcon(R.drawable.ic_tabs_notification_2) 
         .setLargeIcon(result); 
       Intent resultIntent = new Intent(context, CommentsActivity.class); 
       setupPostDetails(notificationBuilder, resultIntent, postId, userId, name, context); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

的build.gradle配置:

compileSdkVersion 23 
buildToolsVersion "23.0.1" 
compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_7 
    targetCompatibility JavaVersion.VERSION_1_7 
} 
defaultConfig { 
    applicationId 'com.schan.tabs' 
    multiDexEnabled true 
    minSdkVersion 19 
    targetSdkVersion 23 
    versionCode 16 
    versionName "1.16" 
    signingConfig signingConfigs.Tabs 
} 

如果任何人有任何想法,爲什麼發生這種情況,一些有識之士將不勝感激。我有一個三星SM-G900V(三星S5)和我的朋友有一個加一個電話,如果有幫助。

+0

https://medium.com/exploring-android/android-n-introducing-upgraded-notifications-d4dd98a7ca92#.3xrmucoq2 –

回答

2

我認爲你需要提供新的通知圖標Android版6 &上的透明背景,所以當你設置的圖標通知如下:

.setSmallIcon(android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP ? R.drawable.ic_notif_with_transparent_bg : R.drawable.ic_notif_current) 

如果你想顯示照片,也許你可以嘗試使用RemoteViews

+0

你好,是的,我完全理解,我需要一個透明的背景,但我不看看我想渲染的照片如何可能。我沒有將我想要顯示的圖像存儲爲可繪製的圖像。你能詳細說明'RemoteViews'嗎? – user1871869

+1

也許你可以關注這個鏈接,例如RemoteViews https://futurestud.io/tutorials/glide-loading-images-into-notifications-and-appwidgets。您需要的RemoteViews爲您的通知創建自定義佈局 – Sodiq

0

希望這將有助於您:

int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.your_logo_for_Kitkat : R.mipmap.your_logo_for_Lolipop_and_uper_version; 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
     .setSmallIcon(icon) 
     .setContentTitle(remoteMessage.getData().get("title")) 
     .setContentText(remoteMessage.getData().get("shortDescription")) 
     .setAutoCancel(true) 
     .setSound(defaultSoundUri) 
     .setColor(Color.RED) 
     .setStyle(notiStyle) 
     .setContentIntent(pendingIntent); 

對於URL負載:

private class sendNotification extends AsyncTask<String, Void, Bitmap> { 

     Context ctx; 
     String message; 

    public sendNotification(Context context) { 
     super(); 
     this.ctx = context; 
    } 

    @Override 
    protected Bitmap doInBackground(String... params) { 

     InputStream in; 
     message = params[0] + params[1]; 
     try { 

URL url = new URL(params[2]); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     in = connection.getInputStream(); 
     Bitmap myBitmap = BitmapFactory.decodeStream(in); 
     return myBitmap; 




     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 

     super.onPostExecute(result); 
     try { 
      NotificationManager notificationManager = (NotificationManager) ctx 
        .getSystemService(Context.NOTIFICATION_SERVICE); 

      Intent intent = new Intent(ctx, NotificationsActivity.class); 
      intent.putExtra("isFromBadge", false); 


      Notification notification = new Notification.Builder(ctx) 
        .setContentTitle(
          ctx.getResources().getString(R.string.app_name)) 
        .setContentText(message) 
        .setSmallIcon(R.drawable.ic_launcher) 
        .setLargeIcon(result).build(); 

      // hide the notification after its selected 
      notification.flags |= Notification.FLAG_AUTO_CANCEL; 

      notificationManager.notify(1, notification); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
相關問題