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 и т. Д.), А не что-то в устройстве. Вышеприведенный код работает, но изображение слишком велико или слишком мало. Я хотел бы узнать оптимальный размер или соотношение сторон для растрового изображения, чтобы я мог предоставить соответствующее изображение

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

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

  • Ldpi: 48×48 px * 0.75
  • Mdpi: 64×64 px * 1.00
  • Hdpi: 96×96 px * 1.50
  • Xhdpi: 128×128 px * 2.00
  • Xxhdpi: 192×192 px * 3.00

Есть два подхода:

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

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

Сначала для получения изображения с 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); } 

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

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

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

  .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)); 

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

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

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

Другое дело здесь, чтобы знать, что базовые макеты имеют поля, указанные на этих изображениях, поэтому, если вы пытаетесь имитировать поведение, наблюдаемое в базовых макетах в пользовательском макете, обязательно сделайте что-то подобное. Оформить заказ 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 
Intereting Posts
Могу ли я использовать tcpdump для получения HTTP-запросов, заголовка ответа и тела ответа? Совместное использование Android на Facebook и других социальных сетях Как сделать телефонный звонок с динамиком на Как получить определенное слово от String в JAVA Android? Android 4.4.2 LocationResult.hasResult (намерение) дает Unmarshalling неизвестный тип кода Как я могу программно сделать скриншот веб-просмотра, захватив полную страницу? Почему функция onCreate () защищена? Как настроить ширину и высоту для пользовательского представления программно? Найдите оставшийся день и время, используя jodatime У lambdas в компиляторе Android N есть ссылки на класс включения? В Android-приложении «Hello World» не говорится «Привет», Трансляция вызова вызова: результат = ОТМЕНА forIntent Курсор MediaStore Cursor с использованием определенной папки Почему сжатие PNG намного медленнее, чем JPEG на Android? Regex для удаления пробелов между номерами