GCM Push Notification Large Icon size

33,663

Solution 1

I was having the same problem. This is how I solve it:

First you need to know the max sizes of the notification icon depending of the device resolution. Searching, I found this:

  • 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

There are 2 approach:

  • One is having a set of images in those dimension in the server, and get them depending of your device resolution.
  • The other one is having the larger image in the server and resize it in the app depending of your device resolution.

I will explain to you the second one that I implement.

First for get the Image from an URL I use this:

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;
    }
}

Then I need to know the factor for the new image size. I know that in the server I have the xxhdpi image with a factor of *3.00, I use that for get the global factor:

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

Now I have to resize the image size and set the new bitmap in the notification icon:

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

This work for me. I hope you can use it.

Solution 2

If I understood your problem perfectly, then the below will help you.

If you have the image already.. then you can set it like

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

The total one:

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

You can also get help from this tutorial..

EDIT: To change a bitmap size ..taken from here..

Bitmap bitmap = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
profileImage.setImageBitmap(Bitmap.createScaledBitmap(bitmap , 64, 64, false));
Share:
33,663
Ram G Athreya
Author by

Ram G Athreya

Updated on July 26, 2022

Comments

  • Ram G Athreya
    Ram G Athreya almost 2 years

    Hi Iam implementing Push Notifications in Android using GCM. I am trying to set an image for the notification instead of the default app icon. I am able to achieve this using the following code

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

    Typically the image will be from the web(jpg, png etc) and not something in the device. The above code works but the image is either too big or too small. I would like to know the optimum size or aspect ratio for the bitmap so that I can supply an appropriate image

  • Ram G Athreya
    Ram G Athreya almost 10 years
    Image will be a url like take this for instance 1.bp.blogspot.com/_rKG-ziTSNUQ/S7H2oaUkKeI/AAAAAAAABTI/… I have square images i just need to know the optimal size across devices
  • Ranjit
    Ranjit almost 10 years
    @RamGAthreya You can change a bitmap size and put it in notification..no approx needed..it should be 32 px/ 64 px
  • Sufian
    Sufian over 7 years
    @user25 what you are referring to is status bar icons guidelines, but the OP and the answerer are talking about is the size of the image set via NotificationCompat.Builder.setLargeIcon().