8

У меня возникла проблема с правильной настройкой и отправкой уведомлений. Я прочитал новую спецификацию для уведомлений Lollipop 5.0 update здесь: https://material.google.com/style/icons.html и https://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 
} 

Если у кого есть какие-либо идеи, почему это происходит, некоторое представление будет высоко ценится. У меня Samsung SM-G900V (Samsung S5), а у моего друга есть телефон One plus One, если это помогает.

+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(); 
     } 
    } 
}