web-dev-qa-db-fra.com

GCM Push Notification Large Size Icon

Hi Iam implémente les notifications push dans Android à l'aide de GCM. J'essaie de définir une image pour la notification au lieu de l'icône de l'application par défaut. Je suis capable d'y parvenir en utilisant le code suivant

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

En règle générale, l'image provient du Web (jpg, png, etc.) et non de quelque chose dans l'appareil. Le code ci-dessus fonctionne mais l'image est trop grande ou trop petite. J'aimerais connaître la taille ou le rapport hauteur/largeur optimal du bitmap afin de pouvoir fournir une image appropriée

15
Ram G Athreya

J'avais le même problème. Voici comment je le résous:

Vous devez d’abord connaître les tailles maximales de l’icône de notification en fonction de la résolution du périphérique. En cherchant, j'ai trouvé ceci:

  • 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

Il y a 2 approches:

  • L'une consiste à avoir un ensemble d'images dans ces dimensions sur le serveur et à les obtenir en fonction de la résolution de votre appareil.
  • L'autre est d'avoir l'image plus grande sur le serveur et de la redimensionner dans l'application en fonction de la résolution de votre appareil.

Je vais vous expliquer le second que je mets en œuvre.

D'abord pour obtenir l'image à partir d'une URL, j'utilise ceci:

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

Ensuite, j'ai besoin de connaître le facteur pour la nouvelle taille de l'image. Je sais que sur le serveur, j'ai l'image xxhdpi avec un facteur de * 3,00, je l'utilise pour obtenir le facteur global:

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

Maintenant, je dois redimensionner la taille de l'image et définir le nouveau bitmap dans l'icône de notification:

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

Ce travail pour moi. J'espère que vous pourrez l'utiliser.

39
OscarBudo

Si j'ai parfaitement compris votre problème, les solutions ci-dessous vous aideront.

Si vous avez déjà l'image .. alors vous pouvez la définir comme

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

Le total:

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

Vous pouvez également obtenir de l'aide à partir de ce tutorial ..

EDIT: Pour changer la taille d'un bitmap ..suite de ici ..

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

L’autre chose à savoir est que les marges des bases sont définies sur les dispositions de base. Par conséquent, si vous essayez d’imiter le comportement observé par les dispositions de base dans une disposition personnalisée, veillez à faire de même. Consultez notification_template_icon_group.xml pour plus de détails.

Ici, j'ai calculé le calcul en pixels pour vous (64dp - 12dp):

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