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