GCM Push Notification Большой размер значка

Привет, я предлагаю Push-уведомления в Android с помощью GCM. Я пытаюсь установить изображение для уведомления вместо значка приложения по умолчанию. Я могу добиться этого, используя следующий код

if(extras.getString("src") != null){
            URL url = new URL(extras.getString("src"));
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap large_icon = BitmapFactory.decodeStream(input);
            mBuilder.setLargeIcon(large_icon);
        }

Обычно изображение будет из Интернета (jpg, png и т.д.), а не что-то в устройстве. Вышеприведенный код работает, но изображение слишком велико или слишком мало. Я хотел бы узнать оптимальный размер или соотношение сторон для растрового изображения, чтобы я мог предоставить соответствующее изображение

Ответ 1

У меня была такая же проблема. Вот как я его решаю:

Сначала вам нужно знать максимальные размеры значка уведомления в зависимости от разрешения устройства. Поиск, я нашел это:

  • ldpi: 48x48 px * 0.75
  • mdpi: 64x64 px * 1.00
  • hdpi: 96x96 px * 1.50
  • xhdpi: 128x128 px * 2.00
  • xxhdpi: 192x192 px * 3.00

Существует 2 подхода:

  • Один из них имеет набор изображений в этих размерах на сервере и получает их в зависимости от разрешения вашего устройства.
  • Другой имеет большее изображение на сервере и изменяет его размер в приложении в зависимости от разрешения вашего устройства.

Я объясню вам вторую, которую я реализую.

Сначала для получения изображения с URL-адреса я использую это:

public Bitmap getBitmapFromURL(String strURL) {
    try {
        URL url = new URL(strURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

Затем мне нужно знать фактор для нового размера изображения. Я знаю, что на сервере у меня есть изображение xxhdpi с коэффициентом * 3,00, я использую это для получения глобального фактора:

public static float getImageFactor(Resources r){
      DisplayMetrics metrics = r.getDisplayMetrics();
      float multiplier=metrics.density/3f;
      return multiplier;
  }

Теперь мне нужно изменить размер изображения и установить новое растровое изображение в значке уведомлений:

Bitmap bmURL=getBitmapFromURL(largeIcon);
float multiplier= getImageFactor(getResources());
bmURL=Bitmap.createScaledBitmap(bmURL, (int)(bmURL.getWidth()*multiplier), (int)(bmURL.getHeight()*multiplier), false);
if(bmURL!=null){
    mBuilder.setLargeIcon(bmURL);
}           

Эта работа для меня. Надеюсь, вы сможете его использовать.

Ответ 2

Если я правильно понял вашу проблему, тогда вам поможет ниже.

Если у вас уже есть изображение, вы можете установить его как

  .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_app_sky))
  .setSmallIcon(R.drawable.ic_aaja_icon_red)

Общее:

 NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder.setNumber(COUNTER)
     .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_app_sky))
     .setSmallIcon(R.drawable.ic_icon_red)
     .setAutoCancel(true)
     .setContentTitle(pushCount > 1 ? "xxx" + pushCount : title)
     .setContentText(pushCount > 1 ? "yyy" : message)
     .setWhen(when)
     .setContentIntent(PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT))
   //.setDeleteIntent(PendingIntent.getBroadcast(context, 0, new Intent(Intent.ACTION_CLEAR_NOTIFICATION), PendingIntent.FLAG_CANCEL_CURRENT))
     .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)
     .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

Вы также можете получить помощь от этого tutorial..

EDIT: изменить размер растрового изображения.. из здесь..

Bitmap bitmap = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
profileImage.setImageBitmap(Bitmap.createScaledBitmap(bitmap , 64, 64, false));

Ответ 3

Другое дело здесь, чтобы знать, что базовые макеты имеют поля, указанные на этих изображениях, поэтому, если вы пытаетесь имитировать поведение, наблюдаемое в базовых макетах в пользовательском макете, обязательно сделайте что-то подобное. За дополнительной информацией обратитесь к уведомлению notification_template_icon_group.xml.

Здесь я вычислил математику для пикселей для вас (64dp - 12dp):

ldpi 48 - 9 = 39
mdpi 64 - 12 = 52
hdpi 96 - 18 = 78
xhdpi 128 - 24 = 104
xxhdpi 192 - 36 = 156